2009-07-06 16 views
5

używam boost :: asio i mam kod jak poniżej:boost :: asio: Jak używać async_accept do akceptowania połączeń przychodzących?

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

Ten kod działa, ale chciałbym, aby przełączyć się na używanie akceptora :: async_accept tak, że mogę zadzwonić Akceptanta :: anuluj, aby przestać odbierać żądania.

Więc mój nowy kod wygląda następująco:

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

Ale ten kod nie wydają się działać, moja funkcja CServer :: HandleAccept nigdy nie jest wywoływana. Jakieś pomysły? Przyjrzałem się przykładowemu kodowi, a główną różnicą między moim kodem a ich jest to, że wydają się często tworzyć klasę jak tcp_connection, która ma gniazdo jako członek, i nie widzę powodu, dla którego jest to konieczne.

  • Alex

Odpowiedz

11

Ach, wygląda na rozpoczniemy trzeba uruchomić IOService, np .:

m_IoService.run(); 
Powiązane problemy