我试图通过程序在该行中保持阻塞来取消TCP接受器。
一个线程等待这样的连接:
boost::system::error_code ec;
acceptor_ = new boost::asio::ip::tcp::acceptor(io_service_, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port));
acceptor_->accept(socket_, ec); // socket_ is a boost::asio::ip::tcp:socket
必须关闭接受器的线程:
boost::system::error_code ec;
acceptor_->close(ec);
我有什么遗失的吗?我没有使用任何异步操作,所以我可以用io_service对象做什么吗?
答案 0 :(得分:1)
简而言之,您无法使用 asio 函数和方法取消大多数异步操作。
问题是基础accept
,read
等是系统调用。它们不能使用io_service::stop
或cancel
来中断,因为接受线程在syscall中被阻止,而不是asio事件循环。它们只能通过杀死线程或发送信号来中断。
我宁愿让这个接受者异常,所以问题就会消失。另请参阅this Q on SO关于此