Godot实现NTP网络对时

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)

猜你喜欢

转载自blog.csdn.net/a363533090/article/details/115802846