boost :: asio server - обнаруживает сбой при прослушивании порта сервера - PullRequest
7 голосов
/ 15 февраля 2011

У меня есть сервер на основе 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 о сбое прослушивания порта сервера?

Ответы [ 2 ]

9 голосов
/ 15 февраля 2011

boost::asio::ip::tcp::acceptor используемый вами конструктор имеет аргумент по умолчанию reuse_address = true.это устанавливает опцию сокета SO_REUSEADDR.отключив эту опцию, вы получите сообщение об ошибке acceptor.listen(). больше информации о SO_REUSEADDR здесь

Имейте в виду, что этот параметр обрабатывается по-разному в Windows и Linux

0 голосов
/ 15 февраля 2011

Ошибка, которую вы хотите, будет выдана или возвращена из boost::asio::ip::tcp::acceptor::bind().Конструктор , который вы используете, будет демонстрировать то же поведение, я предлагаю вам свести ваш пример к чему-то меньшему, которое можно воспроизвести.Мне не очевидно, как вы обрабатываете исключения, выданные из вашего MessageServer ctor.

...