我有一个正在从同一端口上的多个多播源接收数据的应用程序。我能够接收数据。但是,我试图考虑每个组的统计信息(即接收到的msgs,接收到的字节),并且所有数据都变得困惑起来。有谁知道如何解决这个问题?如果我尝试查看发送方的地址,它不是多播地址,而是发送方计算机的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中描述的bind解决方法,我意识到ip(7) manpage描述了一种可能的解决方案:
然后,您可以使用以下方法激活过滤器以接收加入的组的消息:
int mc_all = 0;
if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_ALL, (void*) &mc_all, sizeof(mc_all))) < 0) {
perror("setsockopt() failed");
}
在Redhat Bug 231899中讨论了此问题以及解决方案启用IP_MULTICAST_ALL的方法,该讨论包含测试程序以重现并解决该问题。