如何在等待时取消 `boost::asio::read` 操作

Gam*_*ads 6 c++ sockets boost-asio

我正在使用boost::asio从客户端到服务器来回传输数据。我在客户端有一个读取器线程来读取在客户端的套接字上接收到的数据。请注意,我boost::asio::read在客户端和boost::asio::write服务器端使用。不使用async_readasync_write。一切都很好。

但是,当我关闭我的应用程序时,该应用程序有 2 次 10 次没有完全拆除或正确关闭。它在关闭时挂起问题如下:

当我的应用程序关闭期间调用析构函数时,我的关闭函数被调用。以下是关闭函数的代码:

socket.cancel();
socket.close();
boost::system::error_code ec;
socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
Run Code Online (Sandbox Code Playgroud)

问题是boost::asio::read当它没有获得任何数据时调用不会返回并继续等待它。只要我可以取消它,这应该没问题。我正在尝试socket.cancel在退出时取消所有读取操作。但是,它似乎不起作用。我在一些论坛上读到socket.cancel只取消async_read操作。是这样吗 ?那么当我的应用程序需要退出时取消 boost::asio::read` 操作的方法是什么?

seh*_*ehe 5

这就是阻塞 IO 的本质。

确实socket.cancel()(甚至io_service::stop())不适用于同步操作。

中断它的唯一方法是使用套接字级超时(但 Asio 不公开)或使用异步信号(例如,在终端中按 Ctrl-C 向子进程发送一个 SIGINT)。

如果您坚持在超时的情况下运行单个操作,我之前已经创建了一个穷人的包装器: