2009-07-06 18 views
5

Sto usando boost :: asio, e non ho il codice come questo:boost :: asio: come utilizzare async_accept per accettare le connessioni in entrata?

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

Questo codice funziona, ma mi piacerebbe passare ad usare Acceptor :: async_accept modo che io possa chiamare Acceptor :: annullare per interrompere la ricezione delle richieste.

Quindi il mio nuovo codice simile a questo:

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

Ma questo codice non sembra funzionare, la mia funzione CServer :: HandleAccept non viene mai chiamato. Qualche idea? Ho esaminato il codice di esempio e la differenza principale tra il mio codice e il loro è che sembrano spesso creare una classe come tcp_connection che ha il socket come membro e non vedo perché sia ​​necessario.

  • Alex

risposta

11

Ah, assomiglia a calci alle cose fuori è necessario eseguire l'IOService, ad es .:

m_IoService.run(); 
Problemi correlati