我使用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工具Network
的标签Resource Monitor
,我们看到第一个启动的进程侦听网络端口10000
,第二个进程不侦听任何端口。
在第一个进程停止后立即 - 第二个进程开始侦听网络端口10000
。
所以看起来第二个进程一直等到第一个进程停止侦听TCP端口。
所需行为:app绑定到TCP端口,或者如果已经使用TCP端口则停止。 所以在这个测试用例中,第二个进程应该以异常停止。
如何实现这种行为?
答案 0 :(得分:0)
答案很简单 - 我们需要将选项reuse_address
设置为false。 new boost::asio::ip::tcp::acceptor(_ioService, endpoint, false)
非常完美。此选项的说明 - asio docs