Linux Linux多播编程(No such device)解决方法
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <fcntl.h> 5 #include <sys/socket.h> 6 #include <netinet/in.h> 7 #include <arpa/inet.h> 8 #include <string.h> 9 #include <errno.h> 10 #include <sys/types.h> 11 12 int main(int argc, char*argv[]) 13 { 14 int sockfd; // 套接字文件描述符 15 struct sockaddr_in local_addr; // 本地地址 16 int err = -1; 17 char group[16] = "224.0.0.88"; // 多播组 IP 18 19 sockfd = socket(AF_INET, SOCK_DGRAM, 0); //建立套接字 20 if (sockfd == -1) 21 { 22 perror("socket()"); 23 return -1; 24 } 25 26 // 初始化地址 27 memset(&local_addr, 0, sizeof(local_addr)); 28 local_addr.sin_family = AF_INET; 29 local_addr.sin_addr.s_addr = htonl(INADDR_ANY); 30 local_addr.sin_port = htons(8080); 31 32 // 绑定socket 33 err = bind(sockfd,(struct sockaddr*)&local_addr, sizeof(local_addr)); 34 if(err < 0) 35 { 36 perror("bind()"); 37 return -2; 38 } 39 40 struct ip_mreq mreq; // 多播地址结构体 41 42 // 加入多播组,相当于创建一个QQ群,某人加入此群 43 mreq.imr_multiaddr.s_addr = inet_addr(group); // 多播地址,类似于 QQ 群号 44 mreq.imr_interface.s_addr = htonl(INADDR_ANY);// 将本机加入多播组,类似于某人加入此群 45 46 // 加入多播组 47 err = setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); 48 if (err < 0) 49 { 50 perror("[50]setsockopt():IP_ADD_MEMBERSHIP"); 51 return -4; 52 } 53 54 int times = 0; 55 int addr_len = 0; 56 char buff[256] = {0}; 57 int n = 0; 58 59 printf("加入多播组成功,准备接收数据\n"); 60 61 //接收数据 62 while(1) 63 { 64 addr_len = sizeof(local_addr); 65 memset(buff, 0, sizeof(buff)); 66 67 // 接收数据 68 n = recvfrom(sockfd, buff, sizeof(buff), 0,(struct sockaddr*)&local_addr, 69 &addr_len); 70 if( n == -1) 71 { 72 perror("recvfrom()"); 73 close(sockfd); 74 return -1; 75 } 76 77 printf("Recv message from server: %s\n", buff); 78 } 79 80 // 退出广播组 81 err = setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof(mreq)); 82 if (err < 0) 83 { 84 perror("[79]setsockopt():IP_DROP_MEMBERSHIP"); 85 return -4; 86 } 87 88 89 close(sockfd); 90 91 return 0; 92 }

这主要和当前的网络配置有关,因为多播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 //查看路由表信息
具体操作过程如下图:
壹蓑烟雨任平生!

浙公网安备 33010602011771号