boost asio取消读取而不取消写入

boost asio cancelling read without cancelling write

本文关键字:取消 读取 asio boost      更新时间:2023-10-16

我有一个套接字,它既等待数据,也尝试发送一些数据(async_read/async_write),在某个时候我想取消只读,可能在稍后阶段重新初始化它。

有可能吗?

不幸的是,在asio中中止特定的异步操作相当困难。通常,只有完全关闭套接字才能可靠地中止挂起的异步操作。

在实践中,这并不像人们想象的那样是一个限制:如果您允许在任何时候取消异步操作,那么就很难推断连接的状态。在您的示例中,即使取消了不需要的读取,它应该检索的数据仍然必须从套接字中删除,这样后续的读取就可以从干净的状态开始。在这种控制水平下很难确保这一点。

相反,考虑完成异步读取操作,并使用程序逻辑来确定如何处理读取数据:如果操作被标记为已取消,您可能只想丢弃数据。

也许您需要关闭您的套接字?

socket.shutdown(boost::asio::ip::tcp::socket::shutdown_receive);

调用shutdown后,套接字将无法接收新数据。