2012-05-09 34 views
0

我使用boost asio實現TCP套接字。我已經按照聊天服務器的例子。我第一次運行套接字服務器,它工作正常。 Im做這樣的:增強asio套接字不能連接後停止

 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); 

}

啓動它後,我呼籲停止方法,這樣寫的:

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的犯規顯示)。後來,我嘗試再次調用運行,並且拋出任何錯誤,端口已經啓動(我可以用netstat看到),但是任何連接都被接受(async_accept永遠不會喚醒)。

我認爲這可能是有關io_service,但如果在停止方法,使重置和錯誤125(操作取消)引發。

有什麼想法?


是的,我稱之爲startAccept我收到一個新的連接,但與錯誤125,這是正常的同一時刻?我在哪裏可以讀到關於它的一些信息

我startAccept:

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); 
} 

回答

0

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(); 
      
    // ... 
   } 
+0

如果我這樣做,即時獲取錯誤代碼125操作取消)在句柄接受... – opernas

+0

假設你的'StartAccept()'函數接受一個連接,然後立即嘗試接受另一個?然後,這是預期的,並且處理程序正在執行從您以前的調用'stop()'。 – Chad

1

的125你的第二個電話,以「運行後立即得到「是正常的:這是當您調用Stop時取消的上一個暫掛處理程序。 AFAIN只有這樣,才能擺脫這是破壞並重新創建。該io_service (見本answer,你的情況可能是更好的動態分配io_service對象雖然)

如果你的新「async_accept」呼叫仍然失敗,你可能想重新啓動接受器(關閉然後打開/綁定/聽)...因爲你重新創建端點(我猜你用來構造接受器?)