我尝试使用 boost::asio 和 boost::thread 运行异步网络线程。
但是 async_accept 立即返回错误代码 125 - 操作已取消...
附上我的问题的最小样本:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
class Server{
public:
Server()
{ }
void listen(unsigned int port)
{
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port);
boost::asio::ip::tcp::acceptor acceptor(m_io_service, endpoint);
std::cout << "Waiting for incomming connection on port: " << port << std::endl;
acceptor.async_accept(*m_stream.rdbuf(), boost::bind( &Server::handleAccept, this, boost::asio::placeholders::error, boost::ref( acceptor ) ) );
m_listenThread = new boost::thread(boost::bind(&boost::asio::io_service::run, &m_io_service));
}
void stop()
{
m_listenThread->join();
}
private:
void handleAccept(const boost::system::error_code& error, boost::asio::ip::tcp::acceptor& acceptor)
{
std::cout << "receiverd incomming connection" << std::endl;
if(error)
std::cout << "ERROR: " << error.message() << "(" << error.value() << ")" << std::endl;
}
boost::asio::io_service m_io_service;
boost::asio::ip::tcp::iostream m_stream;
boost::thread* m_listenThread;
};
int main(int argc, char *argv[])
{
Server server;
server.listen(10000);
while(1);
}
最佳答案
acceptor::async_accept
立即返回,在出现错误或接受连接时调度处理程序的调用 (1)
listen() 函数正在返回,这导致了接受器的破坏 (2)
当 acceptor
(或 socket
或 deadline_timer
)被销毁时,所有挂起的处理程序都会在 io_service
上调度,错误代码为 asio::error::operation_aborted
。这是为了满足 async_ 函数的后置条件(即“处理程序将被调用一次,就像被 io_service.post()”一样) (3)
因此,在第 (2) 点,您的处理程序正在被调度 - 就在代码返回主循环之前。
修理:
确保 acceptor
在处理程序被调用之前一直存在。这是 asio 异步编程的标准做法。 boost 网站上的示例将帮助您理解(稀疏)asio 文档。
不要失去希望。我花了很长时间才学会如何正确使用 asio,并意识到它的强大功能。
关于c++ - boost asio 在线程中运行 io_service,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36746483/