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