Pregunta

Estoy usando impulso :: asio, y tengo código como el siguiente:

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 detener la recepción de 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();
}

Sin embargo, no parece funcionar este código, mi función CServer :: HandleAccept nunca se llama. ¿Algunas ideas? He mirado en código de ejemplo, y la principal diferencia entre el código y el suyo es que parecen a menudo hacen una clase como tcp_connection que tiene la toma como miembro, y no veo por qué eso es necesario.

  • Alex
¿Fue útil?

Solución

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

m_IoService.run();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top