如何在基于Twisted UDP的应用程序中实现重传

时间:2012-05-16 20:30:06

标签: timeout udp twisted

我想编写一个基于UDP的应用程序,它需要重新传输远程主机未确认的数据包。我假设有两种可能的方法:

  1. 对我的应用程序发送的每个数据包使用reactor.callLater()来调用一个函数,该函数检查是否已收到确认(如果没有,则重新发送数据包)。

  2. 记住特殊列表中的每个数据包,并定期调用一个函数,如果已收到确认,则会检查此列表的所有成员。此函数也将通过reactor.callLater()调用 - 超时设置为下一次重传(列表中所有数据包的最短值)。

  3. 我的问题是:

    1. 第一种方法更简单 - 但Twisted底层实现是否足够有效使用它?
    2. 使用第二种方法时可以中断reactor.callLater()吗?例如,如果我的呼叫安排了20秒,突然我需要发送一个重传间隔为5秒的新数据包?
    3. 最好的问候

      Maciek

1 个答案:

答案 0 :(得分:1)

为了讨论callLater的行为,我将忽略此问题的UDP部分并回答您提出的两个具体问题。 :)

延迟通话的处理非常有效。调度单个新呼叫的O(log N)表示已调度的呼叫数。总的反应堆性能与预定的呼叫数量保持不变。

就“中断”而言,“中断”是你想要的错误词。 Delayed calls can be rescheduled使用resetdelay。当然,您可以始终cancel现有的电话并安排新电话。