Frage

Ich bin mit boost :: asio, und ich habe Code wie folgt:

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

Dieser Code funktioniert, aber ich würde zu verwenden Acceptor wechseln möchte :: async_accept damit ich Acceptor anrufen :: abbrechen Empfangen von Anforderungen zu stoppen.

Also meine neue Code sieht wie folgt aus:

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

Aber dieser Code scheint nicht zu arbeiten, meine Funktion CServer :: HandleAccept wird nie aufgerufen. Irgendwelche Ideen? Ich habe an Beispielcode sah, und der größte Unterschied zwischen meinem Code und sie ist sie scheint oft eine Klasse wie tcp_connection macht, dass die Steckdose als Mitglied hat, und ich sehe nicht, warum das bin notwendig.

  • Alex
War es hilfreich?

Lösung

Ah, sieht aus wie die Dinge Kick-off Sie die IOService laufen müssen, z.

m_IoService.run();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top