举一个具体的例子,假设在同一端口上有2个多播IP(ip1,ip2)。我想运行两个不同的进程,一个监听ip1(而不是ip2),另一个监听ip2(而不是ip1)。所以我在其他进程中用(ip1,port)和(ip2,port)而不是((INADDR_ANY,port)。
从原理上讲这很好,但是假设没有2个ip,而是100个IP,那么我最终创建了100个UDP套接字,现在我的进程无法很好地处理这个问题,我看到了很多数据包丢弃。
基本上,如果我简单地绑定到(INADDR_ANY,端口),然后多播加入50个IP,它就可以正常工作,但是如果我创建50个不同的套接字,则不能。
是预期的吗?具有通配符绑定的套接字是否比特定地址的套接字更有效,还是性能下降是因为现在有太多的套接字,并且现在进行选择和轮询会花费很多时间?
有什么方法不需要创建那么多的套接字,并且进程也不会获取其他进程的数据吗?
最佳答案
我猜您决定使用绑定解决方法,因为与其他操作系统(例如FreeBSD或Windows)相比,您使用的Linux具有不同的行为(请参见https://bugzilla.redhat.com/show_bug.cgi?id=231899)
使用现代内核(从2.6.31开始),可以要求仅接收重置IP_MULTICAST_ALL选项(see manpage ip(7))的已订阅多播组:
int mc_all = 0;
if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_ALL, (void*) &mc_all, sizeof(mc_all))) < 0) {
perror("setsockopt() failed");
}
我从未经历过这种绑定会影响套接字性能的问题,不过,您可以尝试此选项并在INADDR_ANY上进行绑定。也许会有助于您的表现?