Question

J'utilise boost :: asio, et je code comme ceci:

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

Ce code fonctionne, mais je voudrais passer à l'aide Acceptor :: async_accept pour que je puisse appeler :: annuler Acceptor cesser de recevoir des demandes.

Donc, mon nouveau code ressemble à ceci:

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

Mais ce code ne semble pas fonctionner, ma fonction CServer :: HandleAccept ne sera jamais appelé. Des idées? Je l'ai regardé exemple de code, et la principale différence entre mon code et leur est qu'ils semblent font souvent une classe comme tcp_connection qui a la prise en tant que membre, et je ne vois pas pourquoi des thats nécessaire.

  • Alex
Était-ce utile?

La solution

Ah, ressemble à kick off choses que vous devez exécuter le IOService, par exemple:.

m_IoService.run();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top