boost :: asio:如何在async_write处理程序中检测到接收器套接字已关闭?

时间:2019-08-03 03:11:17

标签: c++ boost-asio

实现:

客户端使用async_write将消息发送到服务器。在写处理程序中,它将启动下一个async_write操作。

服务器使用async_read从客户端接收消息。在读取处理程序中,它将启动下一个async_read操作。

我想在远程侧关闭时立即停止异步操作。

当我关闭客户端时,async_read立即使用boost :: asio :: error :: eof错误代码调用处理程序。但是,当服务器关闭时,客户端将继续写入。如何使它使用错误代码调用处理程序?

2 个答案:

答案 0 :(得分:0)

简单来说,您的设计应如下所示:

Call async_read

何时需要写

Call async_write

在先前的async_write调用返回之前,请勿再次调用async_write。 如果需要调用多个async_write操作,请查询缓冲区。

Call async_write
callback pull next buffer from que
Call async_write
callback pull next buffer from que
Call async_write
callback pull next buffer from que

这样做,可以确保每个套接字在所有时间始终仅执行一次async_write操作。应该是这样。 不要这样做。

Call async_write
Call async_write
Call async_write
callback
callback
callback

这是在发生读取操作错误并尝试停止async_write时遇到问题的地方。 当async_read返回错误时,您不再需要在async_write操作中采取其他步骤来取消并发调用。

Call async_read
Call async_write
async_read callback returns with error (do not call async_read again)
async_write returns with error (do not call async_write again)

因此,在调用async_write时,请检查一个标志(iswriting)(如果该标志为true),然后将缓冲区放入队列中。当回调返回时,检查您的队列,拉出下一个缓冲区,然后再次调用async_write。如果iswriting为false,则只需调用async_write而不是将其推送到que。如果您的回调返回并且您的查询最终为空,则再次将iswriting设置为false。

这一切都非常简单...

答案 1 :(得分:0)

您读/写,换句话说,您有协议,因此添加一个新的标志(消息,位...),以说您将关闭套接字,并仅在收到该消息时才关闭套接字。 当然,您的协议必须处理错误。