2009-07-06 33 views
5

Tôi đang sử dụng tăng :: ASIO, và tôi có mã như thế này:boost :: asio: Làm cách nào để sử dụng async_accept để chấp nhận các kết nối đến?

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

Mã này hoạt động, nhưng tôi muốn chuyển sang sử dụng người chấp nhận :: async_accept vì vậy mà tôi có thể gọi người chấp nhận :: hủy để ngừng nhận yêu cầu.

Vì vậy, mã mới của tôi trông như thế này:

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

Nhưng mã này dường như không làm việc, chức năng CServer tôi :: HandleAccept không bao giờ được gọi. Bất kỳ ý tưởng? Tôi đã nhìn vào mã mẫu, và sự khác biệt chính giữa mã của tôi và của họ là họ dường như thường làm cho một lớp như tcp_connection có ổ cắm như một thành viên, và tôi không thấy lý do tại sao đó là cần thiết.

  • Alex

Trả lời

11

Ah, có vẻ như để kick vật tắt bạn cần phải chạy IOService, ví dụ .:

m_IoService.run(); 
Các vấn đề liên quan