MOn*_*DaR 15 networking udp network-programming
我有一个客户端通过UDP广播发送数据.(比如说127.0.0.255:12345)
现在我想让多个服务器监听这些数据.要在本地计算机上执行此操作,他们需要共享端口12345以进行侦听.
我的问题是,如果可能,如果有任何不利之处,并且这种方法可能存在问题.
不幸的是,有一种替代方案会带来很多开销:
实现某种注册过程.在启动时,每个服务器都告诉客户端它的端口.客户端然后将消息发送到每个端口(必须多次发送数据,需要实现某种握手......)
你知道更好的替代方案吗?
如果重要:
我正在使用C++和Boost :: Asio.该软件应该是可移植的(主要是Linux和Windows).
这个答案参考了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的方法在尝试使用便携式软件时会失败.