如何获得recv()接收某些东西的时间?

时间:2015-06-25 02:36:36

标签: python sockets sync

我试图让服务器向客户端发送命令,例如"启动这个",但我想给出具体的时间。让我们说"在10秒内启动它"。 我现在需要的是计算消息到达客户端所花费的时间并减去10秒,这样客户端就可以在服务器所需的时间内启动它。

假设服务器发送"在10秒内启动它"通过recv()到达客户端需要2秒钟,现在客户端将等待8秒并执行所要求的操作。

我已经阅读了许多关于同步的问题,NTP,但我还没有取得成功。我需要同步服务器和客户端时钟吗?或者我认为这种方法是否足够?如果它足够了,如何从服务器离开服务器到客户端获取服务器时,从recv()接收内容的时间如何?

1 个答案:

答案 0 :(得分:1)

如果您的网络延迟足够低(或者您的计时准确度要求足够宽松),您可以安全地忽略网络延迟,然后在10秒内发送"执行"命令就足够了。当然,在那种情况下,您可以等待10个发送然后发送"立即执行"命令也是。

然而,由于您提出了这个问题,您可能需要一种即使在高延迟或可变延迟的情况下也能为您提供良好同步时序的解决方案。为此,同步时钟是唯一真正可靠的方法。如果两台电脑'时钟是同步的,然后你可以发送一个命令,如"在下午3:02执行这个命令"在任何时候(*),然后相信远程计算机将在下午3:02实际执行命令。 NTP可能足以满足您的需求,或者如果您需要非常高的准确度(例如在几微秒内),请查看ptpd作为替代方案。

如果你不想进入正式的时钟同步,但仍然想要一些更好的东西而不仅仅是希望你的网络延迟小到可以忽略,另一种方法是从一台计算机发送测试消息很经常。测试消息应该在其数据有效载荷中包括发送消息发送时发送计算机的当前系统时间,并且接收计算机应该立即在其应答消息中逐字地回送该时间戳。当发送计算机接收到答复时,它可以从其当前系统时间中减去答复分组中找到的时间戳,以计算估计的往返时间。将该值除以2并且您已获得估计的单向行程时间,然后您可以使用该时间来修改延迟时间(希望)以补偿网络延迟。请注意,这种方法有两个限制其准确性的缺点:(1)它假设网络延迟相对恒定(不一定是这种情况,特别是如果您通过TCP发送数据,其中丢弃的数据包可能会导致偶然的显着延迟峰值由于重新发送和强制执行的FIFO数据排序),以及(2)它假设网络是对称的 - 即在一个方向上传输的数据包与在另一个方向上返回的数据包所花费的时间大致相同;根据网络的设置方式,可能会或可能不会出现这样的假设。

(*)好吧,在3:02 PM之前的任何时间,当然,在"充分之前"将是您的网络预期的最坏情况延迟的函数。