boost :: asio: Como eu uso async_accept para aceitar conexões de entrada?
-
23-08-2019 - |
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
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