extends Node
#NTP网络对时(未做超时处理和错误处理)
const JAN_1970 = 2208988800
func i2l(int32):
var i2l = StreamPeerBuffer.new()
i2l.put_32(int32)
i2l.seek(0)
return i2l.get_64()
func ntp():
var err = 0
var udp = PacketPeerUDP.new()
err = udp.set_dest_address("ntp.ntsc.ac.cn",123)
var packSend = StreamPeerBuffer.new()
packSend.put_8(27) #LI|VN|Mode
packSend.put_8(0) #Stratum
packSend.put_8(0) #Poll
packSend.put_8(0) #Precision
packSend.put_32(0) #Root Delay
packSend.put_32(0) #Root Dispersion
packSend.put_32(0) #Reference Identifier
packSend.big_endian = true
packSend.put_64(0) #Reference Timestamp
packSend.put_64(0) #Originate Timestamp
packSend.put_64(0) #Receive Timestamp
var clientSendTime = OS.get_unix_time()+JAN_1970
packSend.put_32(clientSendTime) #Transmit Timestamp
packSend.put_32(0) #Transmit Timestamp
err = udp.put_packet(packSend.data_array)
print("客户-发送时间",clientSendTime)
udp.wait()
var dataRecv = udp.get_packet()
udp.close()
var clientRecvTime = OS.get_unix_time()+JAN_1970
print("客户-接收时间",clientRecvTime)
var packRecv = StreamPeerBuffer.new()
packRecv.big_endian = true
packRecv.data_array = dataRecv
packRecv.seek(24)
var serverClientTime = i2l(packRecv.get_32())
print("服务-客户端时间",serverClientTime)
packRecv.seek(32)
var serverRecvTime = i2l(packRecv.get_32())
print("服务-接收时间",serverRecvTime)
packRecv.seek(40)
var serverSendTime = i2l(packRecv.get_32())
print("服务-发送时间",serverSendTime)
var diff = (serverRecvTime-clientSendTime+serverSendTime-clientRecvTime)/2
print("补偿",diff)
var oldTime = OS.get_unix_time()
print("当前时间",oldTime)
var timeZone = OS.get_time_zone_info()
print("当前时区",timeZone)
var newTime = OS.get_datetime_from_unix_time(oldTime+diff+timeZone.bias*60)
print("校正时间",newTime)
Godot实现NTP网络对时
猜你喜欢
转载自blog.csdn.net/a363533090/article/details/115802846
今日推荐
周排行