无法独占绑定到具有加速 asio 的网络端口
Can't exclusively bind to the network port with boost asio
我使用boost asio开发服务器应用程序。应用程序运行良好。不起作用的是对网络端口的独占绑定。
示例:
void testPortBinding()
{
boost::asio::io_service _ioService;
int serverPort = 10000;
auto endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), serverPort);
boost::shared_ptr<boost::asio::ip::tcp::acceptor> tcpAcceptor(new boost::asio::ip::tcp::acceptor(_ioService, endpoint));
boost::this_thread::sleep(boost::posix_time::time_duration(0, 0, 30, 0));
}
int main()
{
testPortBinding();
return 0;
}
例如,我们同时启动了两个这样的应用程序实例。两个进程都绑定到网络端口并休眠30秒。
使用Windows工具Resource Monitor
的选项卡Network
,我们看到在网络端口10000
上侦听的第一个启动进程和不侦听任何端口的第二个进程。就在第一个进程停止之后,第二个进程开始侦听网络端口10000
。
所以看起来第二个进程等待,直到第一个进程停止侦听TCP端口
所需行为:应用程序绑定到TCP端口,如果TCP端口已使用则停止。所以在这个测试用例中,第二个进程应该异常停止。
如何实现这样的行为?
答案很简单——我们需要将选项reuse_address
设置为false。new boost::asio::ip::tcp::acceptor(_ioService, endpoint, false)
工作非常完美。此选项的说明-asio docs
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 加速C++练习2.4
- 提升 ASIO 无法识别计时器对象
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 缓慢提升ASIO
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- C++ Boost::asio串行通信与Arduino无法写入
- 找不到以下加速库:boost_fiber
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 玩家加速穿越世界(C++)
- 获取加速::p rocess::子的退出代码 在提升::asio::io_service?
- 加速 ASIO 系统错误 995:I/O 操作已中止
- 加速 asio 中的内存泄漏
- 无法独占绑定到具有加速 asio 的网络端口
- 加速 ASIO - 检查是否有任何内容可以从串行端口读取