Pergunta

Eu estou usando boost :: asio, e eu tenho um código como este:

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, mas eu gostaria de passar a usar Acceptor :: async_accept para que eu possa chamar Acceptor :: cancelar para parar de receber pedidos.

Assim, meus novos olhares código como este:

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

Mas este código não parece trabalho, minha função CServer :: HandleAccept nunca é chamado. Alguma ideia? Eu olhei para o código de exemplo, e a principal diferença entre o meu código e deles é que eles parecem muitas vezes fazem uma classe como tcp_connection que tem o soquete como membro, e eu não estou vendo por que isso é necessário.

  • Alex
Foi útil?

Solução

Ah, parece que a coisas Kick Off Você precisa executar o IOService, por exemplo:.

m_IoService.run();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top