升压 ASIO 插座在停止后无法连接

boost asio sockets cant connect after stop

本文关键字:连接 ASIO 插座 升压      更新时间:2023-10-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的事情,但如果在停止方法中进行重置,并且抛出错误 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);
}

在文档中,它指出对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();
     
     // ...
   }

在第二次调用"run"后立即得到的 125 是正常的:它是您调用 Stop 时被取消的上一个挂起处理程序。AFAIN 摆脱这种情况的唯一方法是销毁并重新创建io_service(请参阅此答案,在您的情况下,最好动态分配io_service)

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