2009-07-06 17 views
5

estoy usando impulso :: asio, y tengo código como este:boost :: asio: ¿Cómo uso async_accept para aceptar conexiones entrantes?

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

Este código funciona, pero me gustaría pasar a utilizar aceptador :: async_accept para que pueda llamar aceptador :: cancelar para dejar de recibir solicitudes

Así que mi nuevo código es el siguiente:

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

Pero no parece funcionar este código, mi función CServer :: HandleAccept nunca se llama. ¿Algunas ideas? He observado el código de muestra, y la principal diferencia entre mi código y el de ellos es que a menudo parecen formar una clase como tcp_connection que tiene el socket como miembro, y no veo por qué es necesario.

  • Alex

Respuesta

11

Ah, se parece a poner las cosas fuera que necesita para ejecutar el IOService, por ejemplo .:

m_IoService.run(); 
Cuestiones relacionadas