其他分享
首页 > 其他分享> > Gotdot实现NTP网络对时

Gotdot实现NTP网络对时

作者:互联网

 1 extends Reference
 2 
 3 #NTP网络对时(未做超时处理和错误处理)
 4 
 5 const JAN_1970 = 2208988800
 6 
 7 func i2l(int32):
 8     var i2l = StreamPeerBuffer.new()
 9     i2l.put_32(int32)
10     i2l.seek(0)
11     return i2l.get_64()
12     
13 func ntp():
14     var err = 0
15     var udp = PacketPeerUDP.new()
16     err = udp.set_dest_address("ntp.ntsc.ac.cn",123)
17     var packSend = StreamPeerBuffer.new()
18     packSend.put_8(27) #LI|VN|Mode
19     packSend.put_8(0) #Stratum
20     packSend.put_8(0) #Poll
21     packSend.put_8(0) #Precision
22     packSend.put_32(0) #Root Delay
23     packSend.put_32(0) #Root Dispersion
24     packSend.put_32(0) #Reference Identifier
25     packSend.big_endian = true
26     packSend.put_64(0) #Reference Timestamp
27     packSend.put_64(0) #Originate Timestamp
28     packSend.put_64(0) #Receive Timestamp
29     var clientSendTime = OS.get_unix_time()+JAN_1970
30     packSend.put_32(clientSendTime) #Transmit Timestamp
31     packSend.put_32(0) #Transmit Timestamp
32     err = udp.put_packet(packSend.data_array)
33     print("客户-发送时间",clientSendTime)
34     udp.wait()
35     var dataRecv = udp.get_packet()
36     udp.close()
37     var clientRecvTime = OS.get_unix_time()+JAN_1970
38     print("客户-接收时间",clientRecvTime)
39     var packRecv = StreamPeerBuffer.new()
40     packRecv.big_endian = true
41     packRecv.data_array = dataRecv
42     packRecv.seek(24)
43     var serverClientTime = i2l(packRecv.get_32())
44     print("服务-客户端时间",serverClientTime)
45     packRecv.seek(32)
46     var serverRecvTime = i2l(packRecv.get_32())
47     print("服务-接收时间",serverRecvTime)
48     packRecv.seek(40)
49     var serverSendTime = i2l(packRecv.get_32())
50     print("服务-发送时间",serverSendTime)
51     var diff = (serverRecvTime-clientSendTime+serverSendTime-clientRecvTime)/2
52     print("补偿",diff)
53     var oldTime = OS.get_unix_time()
54     print("当前时间",oldTime)
55     var timeZone = OS.get_time_zone_info()
56     print("当前时区",timeZone)
57     var newTime = OS.get_datetime_from_unix_time(oldTime+diff+timeZone.bias*60)
58     print("校正时间",newTime)

 

标签:Gotdot,get,NTP,packRecv,put,32,var,packSend,对时
来源: https://www.cnblogs.com/btso/p/14669366.html