2009-07-06 481 views
5

我使用boost :: ASIO,我有這樣的代碼:boost :: asio:如何使用async_accept接受傳入連接?

void CServer::Start(int port) 
{ 
    tcp::acceptor acceptor(m_IoService, tcp::endpoint(tcp::v4(), port)); 

    for (;;) 
    { 
     shared_ptr<tcp::socket> pSocket(new tcp::socket(m_IoService)); 

     acceptor.accept(*pSocket); 

     HandleRequest(pSocket); 
    } 
} 

此代碼的工作,但我想切換到使用接受器:: async_accept,這樣我可以調用受體::取消以停止接收請求。

所以我的新代碼如下所示:

void CServer::StartAsync(int port) 
{ 
    m_pAcceptor = shared_ptr<tcp::acceptor>(new tcp::acceptor(m_IoService, tcp::endpoint(tcp::v4(), port))); 

    StartAccept(); 
} 

void CServer::StopAsync() 
{ 
    m_pAcceptor->cancel(); 
} 

void CServer::StartAccept() 
{ 
    shared_ptr<tcp::socket> pSocket(new tcp::socket(m_IoService)); 

    m_pAcceptor->async_accept(*pSocket, bind(&CServer::HandleAccept, this, pSocket)); 
} 

void CServer::HandleAccept(shared_ptr<tcp::socket> pSocket) 
{ 
    HandleRequest(pSocket); 

    StartAccept(); 
} 

但這代碼似乎沒有工作,我的功能CServer :: HandleAccept不會被調用。有任何想法嗎?我已經看過示例代碼,並且我的代碼和他們的代碼之間的主要區別是他們似乎經常使像tcp_connection這樣的套接字作爲成員,並且我沒有看到爲什麼必須這樣做。

  • 亞歷

回答

11

啊,看起來像踢東西了,你需要運行IOService的,例如:

m_IoService.run(); 
相關問題