我有一个应用程序正在同一端口上从多个多播源接收数据。我能够接收数据。然而,我试图解释每组的统计数据(即收到的消息、收到的字节),并且所有数据都变得混乱。有谁知道如何解决这个问题?如果我尝试查看发送者的地址,它不是多播地址,而是发送机器的 IP。
我正在使用以下套接字选项:
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.1.2.3");
mreq.imr_interface.s_addr = INADDR_ANY;
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
并且:
setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse));
几年后,面对这种 linux 奇怪的行为,并使用前面描述的绑定解决方法answers,我意识到ip(7) 联机帮助页描述一个可能的解决方案:
IP_MULTICAST_ALL(自 Linux 2.6.31 起)
该选项可用于修改
向绑定到通配符 INADDR_ANY 的套接字多播消息
地址。参数是一个布尔整数(默认为 1)。
如果设置为 1,则套接字将接收来自所有套接字的消息
整个系统已在全球范围内加入的团体。
否则,它将仅传递来自以下组的消息:
已明确加入(例如通过
此特定套接字上的 IP_ADD_MEMBERSHIP 选项)。
然后您可以使用以下命令激活过滤器以接收加入组的消息:
int mc_all = 0;
if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_ALL, (void*) &mc_all, sizeof(mc_all))) < 0) {
perror("setsockopt() failed");
}
这个问题以及启用 IP_MULTICAST_ALL 的解决方法在红帽错误 231899,此讨论包含重现问题并解决问题的测试程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)