7

私はboost::asioを使用しており、次のようなコードがあります。

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

このコードは機能しますが、Acceptor :: async_acceptの使用に切り替えて、Acceptor::cancelを呼び出してリクエストの受信を停止できるようにします。

したがって、私の新しいコードは次のようになります。

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のようなクラスを作成することが多いようですが、なぜそれが必要なのかわかりません。

  • アレックス
4

1 に答える 1

12

ああ、IOServiceを実行するために必要なことを開始するように見えます。例:

m_IoService.run();
于 2009-07-06T14:46:20.597 に答える