【发布时间】:2019-08-03 03:11:17
【问题描述】:
实现:
客户端使用 async_write 向服务器发送消息。在写处理程序中,它开始下一个 async_write 操作。
服务器使用 async_read 从客户端接收消息。在读取处理程序中,它开始下一个 async_read 操作。
我想在远程端关闭时立即停止异步操作。
当我关闭客户端时,async_read 立即使用 boost::asio::error::eof 错误代码调用处理程序。但是当服务器关闭时,客户端继续写入。如何让它调用带有错误代码的处理程序?
【问题讨论】:
-
你不能,因为你不能立即知道。您可以检测到它的唯一方法是进行写入,而且您几乎可以肯定只会在 后续 写入时检测到它。
-
如果套接字关闭,那么 async_read 将立即返回错误。只要您正在轮询 async_read 并检查错误,那么您就不必担心 async_write 失败。
-
@user207421 是的,实际上是我写的。写入处理程序中的返回值表明我成功传输了整个消息并且没有收到错误。我认为消息被写入缓冲区或其他东西。 “通过写入检测它”是什么意思?
-
@Nina async_read中的错误是我想要的,但我也想让写端知道关闭事件并做一些事情(比如清除消息队列)
-
如果套接字关闭,Asnyc_write 也将返回回调并返回错误。但通常您只需处理 async_read 回调中的错误。从那里您可以清除您的写入队列,因为您的 async_write 也将返回。
标签: c++ boost-asio