提升::asio:如何使用 async_accept 接受传入连接?
-
23-08-2019 - |
题
我正在使用 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();
不隶属于 StackOverflow