2009-07-06 13 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

ああ、あなたは例えば、IOServiceのを実行するために必要なものをキックオフするようになります。:

m_IoService.run(); 
関連する問題