让两个UDP服务器监听同一个端口?

MOn*_*DaR 15 networking udp network-programming

我有一个客户端通过UDP广播发送数据.(比如说127.0.0.255:12345)

现在我想让多个服务器监听这些数据.要在本地计算机上执行此操作,他们需要共享端口12345以进行侦听.

我的问题是,如果可能,如果有任何不利之处,并且这种方法可能存在问题.

不幸的是,有一种替代方案会带来很多开销:
实现某种注册过程.在启动时,每个服务器都告诉客户端它的端口.客户端然后将消息发送到每个端口(必须多次发送数据,需要实现某种握手......)
你知道更好的替代方案吗?

如果重要:
我正在使用C++和Boost :: Asio.该软件应该是可移植的(主要是Linux和Windows).

cdh*_*wie 24

您必须使用SO_REUSEPORT选项将两个进程中的套接字绑定在一起.如果未在第一个进程中指定此选项,则第二个进程中的绑定将失败.同样,如果在第一个而不是第二个中指定此选项,则第二个中的绑定将失败.此选项有效地指定了一个请求("我想绑定到此端口,即使它已经被另一个进程绑定")一个权限("其他进程也可能绑定到此端口").

有关详细信息,请参阅本文档的第4.12节.

  • 它没有显示任何类型.它表明它*是*可能的,它显示*如何.* (2认同)

MOn*_*DaR 6

这个答案参考了cdhowie的答案,cdhowie链接了一个文件,该文件声明SO_REUSEPORT会产生我想要达到的效果.

我研究了如何以及是否实现此选项并主要关注Boost :: Asio和Linux.

如果操作系统等于BSD或MacOSX,则Boost :: Asio仅设置此选项.该代码包含在文件中boost/asio/detail/reactive_socket_service.hpp(Boost版本1.40,在较新版本中,代码已移至其他文件中).
我想知道为什么Asio没有为Linux和Windows这样的平台定义这个选项.

有几篇参考文献讨论过这在Linux中没有实现:https : //web.archive.org/web/20120315052906/http: //kerneltrap.org/mailarchive/linux-netdev/2008/8/7/2851754
http: //kerneltrap.org/mailarchive/linux-kernel/2010/6/23/4586155

还有一个补丁应该将此功能添加到内核:https://web-beta.archive.org/web/20110807043058/http : //kerneltrap.org/mailarchive/linux-netdev/2010/4/19/ 6274993

我不知道这个选项是否适用于Windows,但是通过定义portable作为在Linux上运行的软件的属性,这意味着,SO_REUSEPORT是特定于操作系统的,并且我的问题没有可移植的解决方案.

在我讨论的其中一个讨论中,建议UDP实现一个主监听器,然后将监听器提供给多个从监听器.

我将这个答案标记为已接受(虽然通过接受我自己的答案感觉有点不好),因为它指出了为什么使用SO_REUSEPORT的方法在尝试使用便携式软件时会失败.