У меня есть сервер на основе boost :: asio, который работает нормально, за исключением того, что я пытаюсь добавить проверку, что ничто другое не принимает соединения на тот же порт. Если я создаю два сервера, один из них последовательно принимает подключения, а другой не сообщает об ошибке (какой из них принимает все подключения, кажется, случайным).
Соответствующие биты серверного класса (это шаблон, который использует базовый класс с Accepted () и typedefs для создаваемого типа соединения):
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 о сбое прослушивания порта сервера?