boost::asio:如何使用async_accept接受传入连接?

8

我正在使用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的类,其中socket作为成员,而我看不出为什么那是必需的。

  • 亚历克斯
1个回答

13

啊,看起来要开始运行IOService,例如:

m_IoService.run();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接