停止后,升级asio套接字无法连接

时间:2012-05-09 17:10:24

标签: c++ sockets boost boost-asio

我使用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);
}

2 个答案:

答案 0 :(得分:1)

第二次拨打"运行"是正常的:它是您调用Stop时取消的上一个待处理的处理程序。 AFAIN摆脱它的唯一方法是销毁并重新创建io_service (请参阅此answer,在您的情况下,动态分配io_service可能更好)

如果你的新" async_accept"调用仍然失败,你可能想重新启动接受器(关闭然后打开/绑定/监听)...因为你重新创建了端点(我猜你用它来构建接受器?)

答案 1 :(得分:0)

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

如果您打算再次致电run,那么我认为io_service就像“{1}}一样,不会有任何伤害:

void ActiveSocketServer::stop(){
     io_service.stop();

     // prime to make ready for future run/run_one/poll/poll_one calls
     io_service.reset();
     
     // ...
   }