实现:
客户端使用async_write将消息发送到服务器。在写处理程序中,它将启动下一个async_write操作。
服务器使用async_read从客户端接收消息。在读取处理程序中,它将启动下一个async_read操作。
我想在远程侧关闭时立即停止异步操作。
当我关闭客户端时,async_read立即使用boost :: asio :: error :: eof错误代码调用处理程序。但是,当服务器关闭时,客户端将继续写入。如何使它使用错误代码调用处理程序?
答案 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)
您读/写,换句话说,您有协议,因此添加一个新的标志(消息,位...),以说您将关闭套接字,并仅在收到该消息时才关闭套接字。 当然,您的协议必须处理错误。