Domanda

sto usando boost :: asio, e non ho il codice in questo modo:

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 :: Annulla per interrompere la ricezione di 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 guardato il codice di esempio, e la differenza principale tra il mio codice e la loro è che sembrano spesso fanno una classe come tcp_connection che ha la presa come membro, e non sto vedendo il motivo per cui questo è necessario.

  • Alex
È stato utile?

Soluzione

Ah, assomiglia a calci alle cose fuori è necessario eseguire l'IOService, per esempio:.

m_IoService.run();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top