繁体   English   中英

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

[英]Safely make a read operation complete (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)上,对close()的以下调用将通过访问已存在的对象而导致分段错误空指针。 另一方面,对shutdown()的单次调用只会使读取操作无法完成。 因此,如何积极地以安全的方式完成读取操作?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM