通过完成读取操作,我的意思是使socket::read_some
返回或者调用传递给socket::async_read_some
的处理程序。请注意,我在插槽的接收器端,是我启动了读取操作。我想要完成的是主动关闭套接字连接。连接也可以被动关闭,这由读取操作与boost::asio::error::eof
完成。
我已尝试socket::shutdown()
,然后拨打socket::close()
,如下所示:
boost::system::error_code err;
if (psocket->is_open()) {
psocket->shutdown(tcp::socket::shutdown_both, err);
psocket->close(err);
}
这种方法的问题在于,如果在调用is_open()
返回true
后被动关闭连接,那么在某些操作系统(如Mac OS X)上,以下调用{{1}通过访问已经为空的指针将导致分段错误。另一方面,对close()
的单次调用根本不会使读操作完成。那么,如何以安全的方式主动完成读取操作呢?
答案 0 :(得分:2)
您无法强制执行异步操作以完成状态。但您可以通过调用psocket->cancel()
取消套接字上的所有操作。这将使用boost::asio::error::operation_aborted
错误代码调用所有处理程序。