安全地完成读操作(Boost.Asio)

时间:2015-09-07 06:15:58

标签: c++ multithreading boost boost-asio

通过完成读取操作,我的意思是使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()的单次调用根本不会使读操作完成。那么,如何以安全的方式主动完成读取操作呢?

1 个答案:

答案 0 :(得分:2)

您无法强制执行异步操作以完成状态。但您可以通过调用psocket->cancel()取消套接字上的所有操作。这将使用boost::asio::error::operation_aborted错误代码调用所有处理程序。