无法使用boost asio

时间:2015-12-26 16:10:49

标签: c++ boost network-programming 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工具Network的标签Resource Monitor,我们看到第一个启动的进程侦听网络端口10000,第二个进程不侦听任何端口。 在第一个进程停止后立即 - 第二个进程开始侦听网络端口10000

所以看起来第二个进程一直等到第一个进程停止侦听TCP端口。

所需行为:app绑定到TCP端口,或者如果已经使用TCP端口则停止。 所以在这个测试用例中,第二个进程应该以异常停止。

如何实现这种行为?

1 个答案:

答案 0 :(得分:0)

答案很简单 - 我们需要将选项reuse_address设置为false。 new boost::asio::ip::tcp::acceptor(_ioService, endpoint, false)非常完美。此选项的说明 - asio docs