无法使用 boost 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 开发服务器应用程序。应用程序运行良好。什么不起作用,是对网络端口的独占绑定。
示例:
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