gpt4 book ai didi

linux - 监听端口上的选择性多播组

转载 作者:太空宇宙 更新时间:2023-11-04 04:08:23 26 4
gpt4 key购买 nike

作为一个具体示例,假设同一端口上有 2 个多播 IP(ip1、ip2)。我想运行两个不同的进程,一个监听 ip1(而不是 ip2),另一个监听 ip2(而不是 ip1)。所以我在其他进程中用(ip1,port)和(ip2,port)调用bind,而不是((INADDR_ANY,port)。
原则上工作正常,但假设没有 2 个 IP,而是 100 个 IP,那么我最终创建了 100 个 UDP 套接字,现在我的进程无法很好地处理这个问题,我看到很多数据包丢失。
基本上,如果我简单地绑定(bind)到(INADDR_ANY,端口),然后多播加入 50 个 IP,它可以正常工作,但如果我创建 50 个不同的套接字,则它不会。
是预期的吗?使用通配符绑定(bind)的套接字是否比特定地址的套接字更有效,或者性能下降是因为现在有这么多套接字,现在选择和轮询需要花费很多时间?
有没有什么方法可以让我不需要创建这么多套接字并且进程也不需要获取其他进程的数据?

最佳答案

我猜您决定使用绑定(bind)解决方法,因为您使用的 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");
}

我从未经历过绑定(bind)会影响套接字性能,但您可以尝试此选项并绑定(bind)到 INADDR_ANY。也许这会对你的表现有所帮助?

关于linux - 监听端口上的选择性多播组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20220257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com