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

标签 linux sockets udp multicast

作为一个具体示例,假设同一端口上有 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/

相关文章:

linux - 根据存在的命令终止 Linux 进程

linux - 找到 native 库时出现 Java UnsatisfiedLinkError

C 套接字 - 在选择时被阻止

ruby - 使用 Ruby 连接多个 IP Input 输出接口(interface),Netiom

linux - PACKET_MMAP 的一些问题

windows - Windows 上通过 QUdpSocket 的链路本地多播

c++ - dlclose() 不适用于工厂函数和函数中的复杂静态?

linux - 每个句子在新行中输出 cat 命令

c# - 不同网络中两个应用程序之间的命令

tcp - UDP相对于TCP的优势?