2009-07-06 3 views
5
내가 부스트 : ASIO 사용하고

, 나는이 같은 코드를 가지고 :boost :: asio : 들어오는 연결을 받아들이려면 async_accept를 어떻게 사용합니까?

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

이 코드는 작동하지만, 내가 수락 호출 할 수 있도록 채택 :: async_accept 사용으로 전환하고 싶습니다 :: 취소하면 요청 수신이 중지됩니다.

그래서 내 새로운 코드는 다음과 같습니다

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

을하지만이 코드가 작동하지 않는 것, 내 기능 CServer :: HandleAccept 호출되지 없구요. 어떤 아이디어? 샘플 코드를 살펴 봤는데, 코드와 소켓 코드의 주요 차이점은 소켓을 멤버로 갖는 tcp_connection과 같은 클래스를 만드는 것 같고 필요한 이유가 표시되지 않는다는 것입니다.

  • 알렉스

답변

11

아, 당신은

m_IoService.run(); 
: 예컨대는 IOService을 실행하는 데 필요한 물건을 킥오프처럼 보이는