2009-07-06 4 views
5

Ich bin mit boost :: asio, und ich habe Code wie folgt:boost :: asio: Wie verwende ich async_accept, um eingehende Verbindungen zu akzeptieren?

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 möchte mit Acceptor wechseln :: async_accept so dass ich Acceptor nennen :: Abbrechen, um den Empfang von Anfragen zu beenden.

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, meine Funktion CServer zu arbeiten :: HandleAccept wird nie aufgerufen. Irgendwelche Ideen? Ich habe Beispielcode angeschaut, und der Hauptunterschied zwischen meinem Code und ihren ist, dass sie oft eine Klasse wie tcp_connection machen, die den Socket als Mitglied hat, und ich sehe nicht, warum das nötig ist.

  • Alex

Antwort

11

Ah, sieht aus wie die Dinge Kick-off Sie die IOService, z.B .:

m_IoService.run(); 
ausgeführt werden müssen