【问题标题】:boost asio sockets cant connect after stopboost asio套接字停止后无法连接
【发布时间】:2013-10-10 22:48:16
【问题描述】:

我正在使用 boost asio 来实现 TCP 套接字。我遵循了聊天服务器示例。我第一次运行套接字服务器时它工作正常。我是这样做的:

     void ActiveSocketServer::run() throw (ActiveException){

     initBoost();

     server->startAccept();

     t=new boost::thread(boost::bind(&boost::asio::io_service::run, &io_service));
    }

    void ActiveSocketServer::initBoost(){

       if (isIpV6){
            endpoint=new tcp::endpoint(tcp::v6(), port);
       }else{
            endpoint=new tcp::endpoint(tcp::v4(), port);
       }
       server=new ActiveSocketServerConnection(io_service,
                    *endpoint,
                    port,
                    id,
                    maxSizePacket,
                    this);

}

启动后,我调用stop方法,写成这样:

 void ActiveSocketServer::stop(){
     io_service.stop();
     if (t){
        t->join();
        delete t;
        t=NULL;
      }

      if (endpoint){
        delete endpoint;
        endpoint=NULL;
      }

      if (server){
         delete server;
         server=NULL;
      }
   }

在此之后,端口未启动(netstat 不显示)。稍后,我尝试再次调用 run 并引发任何错误,端口已启动(我可以通过 netstat 看到)但任何连接都被接受(async_accept 永远不会醒来)。

我认为这可能与 io_service 有关,但如果在 stop 方法中进行重置,则会引发错误 125(操作已取消)。

有什么想法吗?


是的,在我调用 startAccept 的同时,我正在接收一个新连接,但出现错误 125。这正常吗?我在哪里可以阅读有关它的信息?

我的开始接受:

   void ActiveSocketServerConnection::startAccept(){

       sessionId++;

        newSession=new ActiveSocketServerSession(   io_service_,
                        getPort(),
                        getId(),
                        maxSizePacket,
                        activeSocketServer,
                        sessionId);

        acceptor_.async_accept( newSession->socket(),
                 boost::bind(&ActiveSocketServerConnection::handleAccept, 
                         this, newSession,
                 boost::asio::placeholders::error));
        }

句柄接受:

   void ActiveSocketServerConnection::handleAccept(ActiveSocketServerSession* newSession,
                                                          const boost::system::error_code& error){
     if (!error){
       newSession->start();

         }else{

    activeSocketServer.onException(error);
}

【问题讨论】:

    标签: c++ sockets boost boost-asio


    【解决方案1】:

    the documentation 中,它声明对run(或类似的)的任何调用都将立即返回,直到调用io_service::reset()

    如果您打算再次致电run,那么我认为像这样“启动”io_service 没有任何害处:

    void ActiveSocketServer::stop(){
         io_service.stop();
    
         // prime to make ready for future run/run_one/poll/poll_one calls
         io_service.reset();
         
         // ...
       }
    

    【讨论】:

    • 如果我这样做,我会在句柄接受中收到错误代码 125(操作已取消)...
    • 假设您的StartAccept() 函数接受一个连接然后立即尝试接受另一个?然后这是预期的,并且处理程序正在从您之前对 stop() 的调用中执行。
    【解决方案2】:

    在第二次调用“run”后得到的 125 是正常的:它是在调用 Stop 时取消的前一个挂起的处理程序。 AFAIN 摆脱它的唯一方法是销毁并重新创建 io_service (请参阅此answer,在您的情况下,动态分配 io_service 可能会更好)

    如果您的新“async_accept”调用仍然失败,您可能想重新初始化接受器(关闭然后打开/绑定/侦听)......因为您重新创建了端点(我猜您曾经用它来构造接受器?)

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 2011-12-05
      • 2016-09-02
      • 1970-01-01
      相关资源
      最近更新 更多