在同一端口上接收多个多播源 - C、Linux

2023-12-12

我有一个应用程序正在同一端口上从多个多播源接收数据。我能够接收数据。然而,我试图解释每组的统计数据(即收到的消息、收到的字节),并且所有数据都变得混乱。有谁知道如何解决这个问题?如果我尝试查看发送者的地址,它不是多播地址,而是发送机器的 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(使用前将#替换为@)

在同一端口上接收多个多播源 - C、Linux 的相关文章

随机推荐