我有一个正在从同一端口上的多个多播源接收数据的应用程序。我能够接收数据。但是,我试图考虑每个组的统计信息(即接收到的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的方法,该讨论包含测试程序以重现并解决该问题。

10-04 13:37