对于一个具体示例,假设在同一端口端口上有2个mcast IP(ip1,ip2)。我想运行两个不同的进程,一个监听ip1(而不是ip2),另一个监听ip2(而不是ip1)。所以我在其他进程中调用了bind(ip1,port)和(ip2,port),而不是((INADDR_ANY,port)。
这在原则上工作正常,但是假设没有2个ips而是100个IP然后我最终创建了100个UDP套接字,现在我的进程无法很好地处理这个,我看到很多数据包掉落。
基本上,如果我只是绑定到(INADDR_ANY,端口),然后多播加入50个IP,它工作正常,但如果我创建50个不同的套接字,那么它没有。
这是预期的吗?具有通配符绑定的套接字是否比特定地址绑定更有效或性能下降是因为现在有这么多套接字现在选择和轮询事情需要花费很多时间?
有什么方法我不需要创建这么多的套接字和进程也没有得到其他进程的数据?
答案 0 :(得分:0)
我猜您决定使用绑定解决方法,因为您使用的Linux与FreeBSD或Windows等其他操作系统相比具有不同的行为(请参阅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。也许它会对你的表现有所帮助?