【问题标题】:boost::asio: How do I use async_accept to accept incoming connections?boost::asio: 如何使用 async_accept 接受传入连接?
【发布时间】:2009-07-06 14:12:26
【问题描述】:

我正在使用 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 这样的类,它以套接字作为成员,我不明白为什么这是必要的。

  • 亚历克斯

【问题讨论】:

    标签: c++ sockets asynchronous boost-asio


    【解决方案1】:

    啊,看起来你需要运行 IOService,例如:

    m_IoService.run();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 2012-05-04
      相关资源
      最近更新 更多