2011-10-06 73 views
3

我想在C中使用Berkeley sockets API创建一个简单的SNTP客户端,但我在计算响应消息的调整时间时遇到了问题。我从RFC2030得到这个。确定(S)NTP数据包的目标时间戳?

当接收到服务器的回复,客户机确定一个目的地 时间戳变量作为到达时间根据其在 NTP时间戳格式时钟。下表总结了四个 时间戳。

  • 原始时间戳(T1):时间请求由客户端发送
  • 接收时间戳(T2):由服务器接收的时间请求
  • 传送时间戳(T3):由服务器
  • 目的地时间戳发送时间回复(T4):时间客户端收到答复

至于我可以告诉大家,我可以通过利用客户端的时间并增加第t计算调整后的当前时间IME偏移它,用时间偏移定义为

t = ((T2 - T1) + (T3 - T4))/2 

我需要知道T4做出这样的计算,但它不是包的消息的一部分。我怎样才能获得这个时间戳?

回答

0

正是从这一点你张贴我相信你应该能够以相同的方式通过你得到T1的T4(也就是说,他们都是根据本地机器时,它处理特定阶段的时间请求)。

原始时间戳(T1):通过客户端发送
目的地时间戳(T4)时间要求:通过客户端

哎呀,我的坏的假设接收到的时间答复。

在收到响应数据包之后,使用类似C gettimeofday function的东西来创建自己的时间戳就足够了吗?

+0

* T1 *实际上嵌入在服务器发回的响应消息中,所以我不需要特殊的技巧来提取它。你可以通过Wireshark在这里将服务器的响应消息的例子分解为:http://i.imgur.com/En4iG.png – Pieter

+0

我可以这样做,但理想情况下我想使用数据包的接收时间戳(如果数据可从系统获得;我不确定),因为它会产生更准确的结果。 – Pieter