提升 asio 取消读取而不取消写入

Posted

技术标签:

【中文标题】提升 asio 取消读取而不取消写入【英文标题】:boost asio cancelling read without cancelling write 【发布时间】:2013-11-20 08:20:20 【问题描述】:

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

有可能吗?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

因此您必须在“消息交换协议”级别执行此操作。【参考方案2】:

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

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

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

【讨论】:

在这种情况下,您只是不需要读取套接字。不要在接收事件处理程序中调用 async_receive。

以上是关于提升 asio 取消读取而不取消写入的主要内容,如果未能解决你的问题,请参考以下文章

内存 SPIKE - 提升 ASIO 异步读取

C++ Boost ASIO:如何读取/写入超时?

提升asio断网处理

如何立即取消 curl 操作?

是否可以在更新前事件期间将焦点设置在控件上而不取消更新?

boost::asio::read 函数挂起