【发布时间】:2014-06-02 11:21:52
【问题描述】:
我正在尝试为在 Linux 主机上运行的非特权进程之间的高性能广播/多播通信找到一个简单的解决方案。我正在寻找一种解决方案,它 1) 简单,2) 无特权(无 root),3) 与语言无关,4) 面向数据包和 5) 高效(Gbit/s 及以上)。
为了说明这一点,我现有的代码只是使用 UDP 套接字进行单播通信,这完全符合上述要求(单播除外)。我已经考虑通过让多个程序监听同一个 UDP 端口(使用SO_REUSEADDR 和/或SO_REUSEPORT)将其扩展到多播,但这实际上并没有将数据包的副本分发给所有进程。
我还研究过使用环回广播 (127.255.255.255) 来访问多个侦听进程,但似乎我需要绑定到环回设备上的多个 IP 地址才能使其正常工作,并添加这些地址需要root。
【问题讨论】:
-
您必须使用address in the multicast address range 才能让所有进程都收到它。
-
为此尝试使用 dbus 可能是值得的。它通常在常见的 Linux 操作系统中默认安装(并运行);它很健壮;它已成为一种惯用的 Linux 进行 IPC 的方式。
-
我对任何涉及中间人进程的事情都持谨慎态度,因为额外的上下文切换和内存复制会严重影响性能。例如,one study 发现 DBus 比 Unix 套接字慢 15 倍。我知道自 2010 年以来已经在 DBus 性能方面做了很多工作,但到目前为止,多播 UDP 似乎更简单,而且毫无疑问也更快。
标签: linux sockets ipc broadcast