Linux 下组播接收不到其他 IP 的数据。 不知道是不是程序代码哪里出错了,但在其他嵌入式机子上运行过是正常的.. ...
情况:
具体实现流程:
创建套接字
#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;
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.