boost :: asio server - 检测无法侦听服务器端口

时间:2011-02-15 10:55:45

标签: c++ boost boost-asio

我有一个基于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中报告服务器端口失败?

2 个答案:

答案 0 :(得分:9)

您使用的

boost::asio::ip::tcp::acceptor构造函数具有默认参数reuse_address = true。这设置了SO_REUSEADDR套接字选项。停用此选项后,您会收到acceptor.listen()上的错误消息。 more info about SO_REUSEADDR here

请注意,此选项为treated differently on windows and linux

答案 1 :(得分:0)

您想要的错误来自boost::asio::ip::tcp::acceptor::bind() thrown or returned。您正在使用的constructor会表现出同样的行为,我建议您将您的示例简化为可重现的较小的示例。对我来说,如何处理从MessageServer ctor抛出的异常并不明显。