无法独占绑定到具有加速 asio 的网络端口

Can't exclusively bind to the network port with boost asio

本文关键字:asio 加速 网络 绑定      更新时间:2023-10-16

我使用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