Linux 下组播接收不到其他 IP 的数据。 不知道是不是程序代码哪里出错了,但在其他嵌入式机子上运行过是正常的.. ...
情况:
- 机器 A 组播发送正常,其他 ip 能接受到机器 A 的数据
- 机器 A 组播接收失败,只能接收到自己发出去的数据,收不到其他 IP 组播发送的数据
- 其他 IP 直接单播发送给机器 A ,A 能接收到
具体实现流程:
-
创建套接字
#define UDP_MCAST_PORT 36000 //组播端口 #define UDP_MCAST_ADDR "224.0.1.88" //组播地址 auto socket = socket(AF_INET,SOCK_DGRAM,0); if (socket <= 0) return false; -
设置端口复用
int opt = 1; if (setsockopt(socket, SOL_SOCKET, SO_REUSEADDR ,(char*)&opt, sizeof(opt)) < 0) return false; -
绑定组播端口
struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(UDP_MCAST_PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(socket, (struct sockaddr*)&addr, sizeof(addr)) < 0) return false; -
加入组播
struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(UDP_MCAST_ADDR); mreq.imr_interface.s_addr = htonl(INADDR_ANY); if (setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq)) < 0) return false; -
发送与接收
//发送 struct sockaddr_in addrSrv; addrSrv.sin_family=AF_INET; addrSrv.sin_addr.s_addr = inet_addr(UDP_MCAST_ADDR); addrSrv.sin_port=htons(UDP_MCAST_PORT); if (sendto(socket, data, dataLen, 0, (struct sockaddr *)&addrSrv,sizeof(addrSrv)) > 0) return true; //接收 struct sockaddr_in group_addr; socklen_t addr_len = sizeof(group_addr); int len = recvfrom(socket, buff, buffLen, 0, (struct sockaddr *) &group_addr, (int *)&addr_len); recvIP = inet_ntoa(group_addr.sin_addr); recvPort = group_addr.sin_port;