【发布时间】:2015-09-07 06:15:58
【问题描述】:
通过完成读取操作,我的意思是让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() 的一次调用根本不会完成读取操作。那么,如何主动让读取操作安全地完成呢?
【问题讨论】:
-
不清楚你在说什么部分。您是否从发送端关闭?为什么不显示哪一侧发生了什么(图表可能会有所帮助)
-
我用的方法和你一样,在Linux环境下我从来没有遇到过你的问题。也许值得向 asio 维护者开张票要求澄清?
-
@sehe 很抱歉描述不清楚。现已更新。
标签: c++ multithreading boost boost-asio