boost asio-到网络端口的独占绑定

boost asio-到网络端口的独占绑定,boost,boost-asio,Boost,Boost Asio,我使用boost asio开发服务器应用程序。应用程序工作得很好。不起作用的是网络端口的独占绑定 我启动应用程序的一个实例-它开始监听传入的连接 我再启动一个实例-它还开始侦听同一端口上的传入连接。传递给async\u accept的处理程序未按预期的错误调用 通常我只是想获得港口。如果操作失败-端口正在使用中。对于Asio,这种方法不起作用。如何检查端口的可用性 void TcpServerFactory::acceptConnectionsOnPort(int serverPort,

我使用boost asio开发服务器应用程序。应用程序工作得很好。不起作用的是网络端口的独占绑定

我启动应用程序的一个实例-它开始监听传入的连接

我再启动一个实例-它还开始侦听同一端口上的传入连接。传递给
async\u accept
的处理程序未按预期的错误调用

通常我只是想获得港口。如果操作失败-端口正在使用中。对于Asio,这种方法不起作用。如何检查端口的可用性

void TcpServerFactory::acceptConnectionsOnPort(int serverPort,
                                               boost::shared_ptr<TcpConfigServerReceiver> tcpConfig,
                                               boost::function<void(boost::shared_ptr<TcpServer>)> onSuccessfullyConnectedHandler)
{
    // todo check is port not busy
    FORMATTED_LOG(this->_log, info) << "Start to accept connections on port " << serverPort;
    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(this->_ioService, endpoint));

    this->acceptConnections(tcpAcceptor, tcpConfig, onSuccessfullyConnectedHandler);
}

void TcpServerFactory::acceptConnections(boost::shared_ptr<boost::asio::ip::tcp::acceptor> tcpAcceptor,
                                         boost::shared_ptr<TcpConfigServerReceiver> tcpConfig,
                                         boost::function<void(boost::shared_ptr<TcpServer>)> onSuccessfullyConnectedHandler)
{
    boost::shared_ptr<boost::asio::ip::tcp::socket> tcpSocket(new boost::asio::ip::tcp::socket(this->_ioService));
    boost::function<void(const boost::system::error_code &)> onAcceptOperationCompletedHandler =
        boost::bind(&TcpServerFactory::onAcceptOperationCompleted, this->downcasted_shared_from_this<TcpServerFactory>(),
                    _1, tcpAcceptor, tcpSocket, tcpConfig, onSuccessfullyConnectedHandler);

    tcpAcceptor.get()->async_accept(*tcpSocket, onAcceptOperationCompletedHandler);
}

void TcpServerFactory::onAcceptOperationCompleted(const boost::system::error_code & err,
                                                  boost::shared_ptr<boost::asio::ip::tcp::acceptor> tcpAcceptor,
                                                  boost::shared_ptr<boost::asio::ip::tcp::socket> tcpSocket,
                                                  boost::shared_ptr<TcpConfigServerReceiver> tcpConfig,
                                                  boost::function<void(boost::shared_ptr<TcpServer>)> onSuccessfullyConnectedHandler)
{
    if (err)
    {
        FORMATTED_LOG(this->_log, info) << "Failed to accept connections on port " << tcpAcceptor->local_endpoint().port() << "due to error " << BOOST_ERROR_TO_STREAM(err);
        return;
    }
    this->acceptConnections(tcpAcceptor, tcpConfig, onSuccessfullyConnectedHandler);
    this->onConnectionEstablished(tcpSocket, tcpConfig, onSuccessfullyConnectedHandler);
}

重用\u地址
不应该这样做。它的意思是在端口释放后避免“等待”间隔。

重用地址不应该这样做。它的意思是在端口释放后避免“等待”间隔。

感谢您的澄清。我误解了文档中关于重用地址的内容。但是,如何使用Asio检查端口的可用性?@VictorMezrin在尝试绑定()时,您将在use中获得
Asio::error::address\u
异常。我使用此acceptor构造函数:
http://goo.gl/QLoR2L
(过载3)。根据文档,它在内部调用了
acceptor.bind()
,但未引发异常。我试图用一系列命令替换构造函数(查看问题的更新)-这也不起作用:(感谢您的澄清。我误解了关于
重用\u地址
的文档。但是如何使用Asio检查端口的可用性?@victorezrin您将在尝试绑定()时得到
Asio::error::address\u-in\u-use
异常)我使用这个接受者的构造函数:
http://goo.gl/QLoR2L
(重载3)。根据内部文档,它调用了
acceptor.bind()
,但未引发异常。我尝试用一系列命令替换构造函数(查看问题的更新)-这也不起作用:(
// boost::shared_ptr<boost::asio::ip::tcp::acceptor> tcpAcceptor(new boost::asio::ip::tcp::acceptor(this->_ioService, endpoint));


boost::shared_ptr<boost::asio::ip::tcp::acceptor> tcpAcceptor(new boost::asio::ip::tcp::acceptor(this->_ioService));
tcpAcceptor->open(endpoint.protocol());
tcpAcceptor->set_option(boost::asio::socket_base::reuse_address(true));
tcpAcceptor->bind(endpoint);
boost::system::error_code err;
tcpAcceptor->listen(boost::asio::socket_base::max_connections, err);