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

注意,这个选项是treated differently on windows and linux

+0

如果我翻译上面的描述,这里是代码。 (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

你想会是从boost::asio::ip::tcp::acceptor::bind()thrown or returned错误。你正在使用的constructor将展示这种相同的行为,我建议你把你的例子放在可重现的小的东西上。我不清楚你如何处理从你的MessageServer ctor抛出的异常。

+0

与任何可以抛出的构造函数一样,无论创建哪个服务器,都会将构造函数包装在try/catch中,如果它是可恢复的,或者让它渗透到外部范围(如果不是)。 – 2011-02-15 16:57:11