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