如何使用 BOOST ASIO 实现重新发送消息的协议
How to implement protocol which resends messages using BOOST ASIO
我正在使用 BOOST ASIO 实现协议,它会重新发送响应以防万一
未被确认。
我同时使用 async_read_some()
和 deadline_timer
运行
查看我是否收到了整个消息或计时器是否先过期和新的
将发送消息。
问题是如果 deadline_timer
先到期我该如何关闭
async_read_some()
并尝试阅读新邮件?
或者是否有更好的方法来实现重新发送消息的协议?
如果您想阅读新消息,我不确定您为什么要打断 async_read_some
。您正在实施的协议中似乎存在一些缺陷(或误解)。
这是一个关于协议的问题,而不是具体的实现。
真正的问题是:如何同步发送和读取?意思是如果我向您网络中的对等点发送消息,那么会发生什么?两个主要想法是:
同步:当我发送一条消息时,无论我读到什么,都应该是对该消息的响应。换句话说,请求响应的顺序是这样的:Req1 -> Resp1 -> Req2 -> Resp2,等等。你也可以通过管道请求,即 Req1 -> Req2 -> Resp1 -> Resp2。但是不同步的响应是不允许的,例如这是不正确的:Req1 -> Req2 -> Resp2 -> Resp1。这种同步方式在HTTP协议中被广泛使用。
异步:对于每条消息,我都会发送一个唯一的 ID,并且我阅读的任何内容都应该有一个 ID。然后我通过 id 将响应与请求匹配。使用这种方法,以下顺序确实是可能的:Req1 -> Req2 -> Resp2 -> Resp1.
使用同步方法,您可以在超时时做什么?您仍然可以等待响应然后丢弃它(使用日志),但是由于同步性质,这将延迟所有其他请求。如果对等点很讨厌,这可能会导致无限等待,最终你会 运行 资源不足。或者,您可以简单地关闭连接。这更安全、更简单,而且通常是开发人员选择的。
使用异步方法,您可以从“id-to-response 处理程序映射”(无论如何都必须维护)中删除 id,仅此而已。并记住丢弃不匹配 id(带日志)的响应。当然最终你也想关闭讨厌的连接。
异步方法确实性能更好,但更难正确实施。
我正在使用 BOOST ASIO 实现协议,它会重新发送响应以防万一 未被确认。
我同时使用 async_read_some()
和 deadline_timer
运行
查看我是否收到了整个消息或计时器是否先过期和新的
将发送消息。
问题是如果 deadline_timer
先到期我该如何关闭
async_read_some()
并尝试阅读新邮件?
或者是否有更好的方法来实现重新发送消息的协议?
如果您想阅读新消息,我不确定您为什么要打断 async_read_some
。您正在实施的协议中似乎存在一些缺陷(或误解)。
这是一个关于协议的问题,而不是具体的实现。
真正的问题是:如何同步发送和读取?意思是如果我向您网络中的对等点发送消息,那么会发生什么?两个主要想法是:
同步:当我发送一条消息时,无论我读到什么,都应该是对该消息的响应。换句话说,请求响应的顺序是这样的:Req1 -> Resp1 -> Req2 -> Resp2,等等。你也可以通过管道请求,即 Req1 -> Req2 -> Resp1 -> Resp2。但是不同步的响应是不允许的,例如这是不正确的:Req1 -> Req2 -> Resp2 -> Resp1。这种同步方式在HTTP协议中被广泛使用。
异步:对于每条消息,我都会发送一个唯一的 ID,并且我阅读的任何内容都应该有一个 ID。然后我通过 id 将响应与请求匹配。使用这种方法,以下顺序确实是可能的:Req1 -> Req2 -> Resp2 -> Resp1.
使用同步方法,您可以在超时时做什么?您仍然可以等待响应然后丢弃它(使用日志),但是由于同步性质,这将延迟所有其他请求。如果对等点很讨厌,这可能会导致无限等待,最终你会 运行 资源不足。或者,您可以简单地关闭连接。这更安全、更简单,而且通常是开发人员选择的。
使用异步方法,您可以从“id-to-response 处理程序映射”(无论如何都必须维护)中删除 id,仅此而已。并记住丢弃不匹配 id(带日志)的响应。当然最终你也想关闭讨厌的连接。
异步方法确实性能更好,但更难正确实施。