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

标签 c++ sockets asynchronous boost-asio

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

  • 亚历克斯

最佳答案

啊,看来要开始你需要运行 IOService 的事情了,例如:

m_IoService.run();

关于c++ - boost::asio:如何使用 async_accept 接受传入连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1087199/

相关文章:

c++ - 如何将 map 和 unordered_map 作为同一个对象来处理

c++ - 在此函数中使用引用参数有什么好处吗?

sockets - 被动和主动 socket

javascript - 如何在调用 this._super 之前捕获 Promise? JavaScript

c++ - #include <opencv2/opencv.hpp> 在 VS 2013 中不起作用

windows - 检测UDP组播接收失败

套接字编程中的 Java 拖放问题

c++ - 长时间运行的 std::async 会饿死其他 std::async 吗?

ios - 异步调用后无法刷新 UI

c++ - 重载一个可以区分非静态成员方法和其他函数的模板函数