Linux多播问题(No such device)解决方法

多播的测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>

int main(int argc, char*argv[])
{
	int sockfd; // 套接字文件描述符
	struct sockaddr_in local_addr; // 本地地址
	int err = -1;
	char group[16] = "224.0.0.88"; // 多播组 IP

	sockfd = socket(AF_INET, SOCK_DGRAM, 0);  //建立套接字
	if (sockfd == -1)
	{
		perror("socket()");
		return -1;
	}    

	// 初始化地址
	memset(&local_addr, 0, sizeof(local_addr));
	local_addr.sin_family = AF_INET;
	local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	local_addr.sin_port = htons(8080);

	// 绑定socket
	err = bind(sockfd,(struct sockaddr*)&local_addr, sizeof(local_addr));
	if(err < 0)
	{
		perror("bind()");
		return -2;
	}    

	struct ip_mreq mreq; // 多播地址结构体                                 

	// 加入多播组,相当于创建一个QQ群,某人加入此群
	mreq.imr_multiaddr.s_addr = inet_addr(group); // 多播地址,类似于 QQ 群号
	mreq.imr_interface.s_addr = htonl(INADDR_ANY);// 将本机加入多播组,类似于某人加入此群

	// 加入多播组
	err = setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
	if (err < 0)
	{
		perror("[50]setsockopt():IP_ADD_MEMBERSHIP");
		return -4;
	} 

	int times = 0;
	int addr_len = 0;
	char buff[256] = {0};
	int n = 0; 

	printf("加入多播组成功,准备接收数据\n");

	//接收数据
	while(1)
	{
		addr_len = sizeof(local_addr);
		memset(buff, 0, sizeof(buff));     

		// 接收数据
		n = recvfrom(sockfd, buff, sizeof(buff), 0,(struct sockaddr*)&local_addr, &addr_len);
		if( n == -1)
		{
			perror("recvfrom()");
			close(sockfd);
			return -1;
		}  

		printf("Recv message from server: %s\n", buff);
	}  

	// 退出广播组
	err = setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof(mreq));
	if (err < 0)
	{
		perror("[79]setsockopt():IP_DROP_MEMBERSHIP");
		return -4;
	}  

	close(sockfd); 

	return 0;
}

在ubuntu编译运行时,出现如下的错误:

查询相关资料得到的答案如下:

It means that the tool is trying to use multicast but the network interface doesn‘t support it There are two likely causes:
·Your machine doesn‘t have multicast support enabled. For example, on Linux and FreeBSD it is possible to compile a kernel which doesn‘t support multicast.  
·You don‘t have a route for multicast traffic. Some systems don‘t add this by default, and you need to run:
route add -net 224.0.0.0 netmask 255.255.255.255 eth0(or similar). If you wish to use RAT in unicast mode only, it is possible to add the multicast route on the loopback interface.

这主要和当前的网络配置有关,因为多播IP地址没有加入到路由表中。


解决方法:把需要用到的多播地址(如本例的224.0.0.88)加入到路由表中,命令如下:

sudo route add -net 224.0.0.88 netmask 255.255.255.255 eth0

224.0.0.88:为当前使用的多播IP地址

eth0:为当前使用的有效网卡

其它辅助命令:

sudo route del -net 224.0.0.88 netmask 255.255.255.255 eth0 //把224.0.0.88从路由表中删除

route -n //查看路由表信息

具体操作过程如下图:

本教程测试代码下载请点此链接:http://download.csdn.net/detail/tennysonsky

版权声明:本博客文章,大多是本人整理编写,或在网络中收集,转载请注明出处!!

时间: 2024-10-25 22:15:30

Linux多播问题(No such device)解决方法的相关文章

Linux一直启动不了的解决方法

Linux一直启动不了的解决方法 虚拟机里的Linux启动不起来 决定开机 按住esc键,看一下到底启动到哪一步出错 从图中可以看出是挂载文件系统的时候出错,文件系统是CIFS, 是samba,Unable to find suitable address 说明机器找不到samba服务器的地址 先用单用户模式启动,编辑/etc/fstab文件 vi  /etc/fstab 注释掉挂载samba那一行 然后重启机器,发现还是不行, 发现这次轮到挂载NFS出问题 再次注释掉NFS那一行重新启动机器

centos编译内核出现:no space left on device 解决方法

1.问题:原来将源码放在根目录下面 编译过程中出现了 no space left on device 利用df -h 命令查看 根目录空间占用完毕 2.将源码改在其他空间很足的地方编译 在make module_install 还是出现no space left on device 但是该目录下面的空间很足 ,继续df -h 根目录满了 3解决方法 将根目录中的不用的文件删除,因为在安装的时候要经过根目录, 所以要保持根目录中的空间充足 centos编译内核出现:no space left on

linux Argument list too long错误解决方法

今日需要删除/tmp目录下的所有文件,文件数量比较多. ls -lt /tmp | wc -l385412 使用 rm * 后,系统提示错误 Argument list too long 原因是在linux下,试图传太多参数给一个系统命令(ls *; cp *; rm *; cat *; etc..)时,就会出现 Argument list too long错误. 解决方法如下: 使用find -exec 遍历,然后执行删除便可. sudo find /tmp -type f -exec rm

Linux 删除mysql数据库失败的解决方法

使用命令:drop database xxx:删除本数据库时却删除失败,系统提示出现了错误,错误代码为: ERROR 1010 (HY000): Error dropping database(can't rmdir './xxx/',errno:17); 解决方法: 1.find /  -name xxx(找到xxx--数据库名的文件夹) 2.rm -rf /xxx/*(删除此文件夹下的所有文件) 总结:应该是在xxx目录下生成了操作数据库时留下的几个非数据库文件,导致无法删除,将这些文件删除

linux下mysql忘记root密码解决方法

如果使用 MySQL 数据库忘记了root账号密码,可以通过调节配置文件,跳过密码的方式登数据库, 在数据库里面修改账号密码,一般默认的账号是 root 1.编辑 MySQL 配置文件 my.cnf 注意: 以实际 my.cnf 配置文件路径为准 vim /etc/my.cnf [mysqld] spik-grant-tables  #增加 2.重启 MySQL 服务 注意:以实际 MySQL 启动脚本路径为准 /etc/init.d/mysqld restart 若报错,注意观察my.cnf配

Linux出现welcome to emergency mode! 解决方法

问题: welcome to emergency mode!after logging in ,type “journalctl -xb” to view system logs,“systemctl reboot” to reboot ,“systemctl default” to try again to boot into default mode. give root password for maintenance (?? Control-D???): 问题原因:报这个错误多数情况下是

【linux基础】安装vim失败解决方法

解决方法 step1. 先卸载vim-common; sudo apt-get remove vim-common step2. 安装vim; sudo apt-get install vim 参考 1. 安装vim失败: 完 原文地址:https://www.cnblogs.com/happyamyhope/p/12320905.html

Linux打开txt文件乱码的解决方法

Linux显示在Windows编辑过的中文就会显示乱码是由于两个操作系统使用的编码不同所致.Linux下使用的编码是utf8,而Windows使用的是gb18030.因此,解决Linux打开txt文件中文乱码可有如下两种方法. 方法一: 在附件终端中,进入到txt文件所在目录,使用命令符"iconv-f gb18030  -t utf8 1.txt -o 2.txt"把gb18030编码的1.txt转换成utf8的2.txt.这样2.txt就成为Linux支持的编码. 方法二: 在附件

宏碁本安装linux系统找不到操作系统的解决方法。

最近在笔记本上安装linux,ubuntu15.04系统.自己做了一个U盘启动盘安装,安装完进入blos设置ubuntu为第一启动项. 之后之后,重启电脑就显示“无法找到操作系统”,完蛋了.没办法,估计是启动项的问题,网上搜了搜,找到了一个超级厉害的万能解决办法,贴下来: 就是Boot-repair, ubuntu特有的傻瓜型修复引导工具.无论是win不能引导, 还是ubuntu不能引导,还是死在grub提示符..反正就是安装ubuntu后启动出问题了, 都可以用这个方法解决, 唯一的要求是安装

linux系统死机分析及解决方法

一.常见死机原因 二.日志分析 日志系统,通过rsyslog.service服务进行控制,分别用于记录系统内核和各应用程序的日志信息.配置文件/etc/rsyslog.conf /var/log/messages    记录系统内核消息及各种应用程序的公共日志信息,包括启动.IO错误.网络错误.程序报错等,对于未使用独立日志文件的应用程序或服务,一般都可以从该文件获得相关事件的日志记录信息. /var/log/cron    记录crond计划任务产生的事件消息 /var/log/dmesg