boost :: asio server - обнаружение сбоя при прослушивании порта сервера

У меня есть сервер на базе boost :: asio, который работает нормально, за исключением того, что я пытаюсь добавить проверку, что ничто другое не принимает соединения на том же порту . Если я создаю два сервера, один из них постоянно принимает соединения, но другой не сообщает об ошибках (какой из двух принимает все соединения, кажется, случайным).

Соответствующие биты класса сервера (это шаблон, который использует базовый класс, имеющий Accepted () и typedef для создаваемого типа соединения):

        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?

7
задан Sam Miller 15 February 2011 в 16:49
поделиться