2009-07-06 18 views
5
Ben boost :: asio kullanıyorum

ve bu gibi bir kod vardır:boost :: asio: gelen bağlantıları kabul etmek için async_accept'i nasıl kullanırım?

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

Bu kod çalışır, ama ben Acceptor çağrı böylece Alıcı :: async_accept kullanarak geçmek istiyorum :: istekleri durdurmak için iptal et.

Yani benim yeni kod şöyle görünür:

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

Ama bu kod çalışmak için görünmüyor, benim fonksiyon CServer :: HandleAccept çağrılan olmadı. Herhangi bir fikir? Örnek kod baktım ve benim kod ve onların onların arasındaki ana fark sık sık bir üye olarak sokete sahip tcp_connection gibi bir sınıf yapmak görünüyor ve neden gerekli olduğunu görmüyorum.

  • Alex

cevap

11

Ah,

m_IoService.run(); 
.: ör IOService çalıştırmak için gereken şeyler başlaması için benziyor
İlgili konular