boost :: asio服务器 - 检测服务器端口失败
我有一个基于boost :: asio的服务器工作正常,除了我试图添加一个检查,没有别的是在同一端口上接受连接。如果我创建了两个服务器,其中一个服务器始终接受连接,但另一个不报告任何错误(两个接受所有连接中的哪一个似乎是随机的)。boost :: asio服务器 - 检测服务器端口失败
服务器类的相关位(这是它使用),其已接受(基类和类型定义用于连接类型的创建模板)是:
MessageServer (boost::asio::io_service &io, unsigned short port_num)
: BaseServerType (io), acceptor_ (io, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port_num)) {
Listen();
}
void Listen() {
boost::system::error_code ec;
acceptor_.listen (boost::asio::socket_base::max_connections, ec);
if (!ec) {
start_accept();
} else {
// not reached even if a separate process
// is already listening to that port
connection_pointer new_connection;
BaseServerType::Accepted (new_connection);
}
}
private:
void start_accept() {
connection_pointer new_connection (CreateConnection (acceptor_.io_service()));
acceptor_.async_accept (new_connection -> Socket(),
boost::bind (&MessageServer::handle_accept, this, new_connection,
boost::asio::placeholders::error));
}
void handle_accept (connection_pointer new_connection, const boost::system::error_code &error) {
if (!error) {
BaseServerType::Accepted (new_connection);
new_connection -> Start();
start_accept();
} else {
// never reached
new_connection.reset();
BaseServerType::Accepted (new_connection);
}
}
boost::asio::ip::tcp::acceptor acceptor_;
acceptor.listen()没有按”也不扔。
如何收听boost :: asio中报告的服务器端口失败?
boost::asio::ip::tcp::acceptor
您使用的构造函数具有默认参数reuse_address = true
。这设置SO_REUSEADDR套接字选项。禁用此选项,您将收到acceptor.listen()
上的错误。 more info about SO_REUSEADDR here
你想会是从boost::asio::ip::tcp::acceptor::bind()
thrown or returned错误。你正在使用的constructor将展示这种相同的行为,我建议你把你的例子放在可重现的小的东西上。我不清楚你如何处理从你的MessageServer
ctor抛出的异常。
与任何可以抛出的构造函数一样,无论创建哪个服务器,都会将构造函数包装在try/catch中,如果它是可恢复的,或者让它渗透到外部范围(如果不是)。 – 2011-02-15 16:57:11
如果我翻译上面的描述,这里是代码。 (boost :: asio :: io_service&io,unsigned short port_num) :BaseServerType(io) ,acceptor_(io,boost :: asio :: ip :: tcp :: endpoint(boost :: asio :: ip: :tcp :: v4(),port_num,false)){ Listen(); } ... try { server = new MessageServer(io_service_,5000); (“绑定错误:%s \ n”,ex.what());}}; catch(std :: exception const&ex) { } } – Hill 2015-11-09 08:16:32