自动将 UDP 请求发送到 NTP 时间服务器



我需要使用 autoit 从本地 ntp 时间服务器获取时间。

; Function gets time from timeserver to not relay on pc time
Func get_Time_From_Time_Server() 
Local $iSocket = UDPOpen(TCPNameToIP($s_Time_Server),  123) ; Port 123
Local $data = ""
While $data = ""
$data = UDPRecv($iSocket, 100)
Sleep(100)
Wend        
EndFunc

打开UDP连接似乎有效,但$data等于"".

在您的代码中哪里有套接字的请求?

以下是从本地 ntp 接收数据的示例(来源(:

#include <Date.au3>
$recv = NTP_Connect("10.24.1.20")
ConsoleWrite($recv & @CRLF)
Parse_Time($recv)
Func NTP_Connect($NTP_Server)
UDPStartup()
Dim $socket = UDPOpen(TCPNameToIP($NTP_Server), 123)
$status = UDPSend($socket, MakePacket("1b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"))
$data = ""
While $data = ""
$data = UDPRecv($socket, 100)
Sleep(100)
WEnd
UDPCloseSocket($socket)
UDPShutdown()
Return $data
EndFunc   ;==>NTP_Connect
Func MakePacket($d)
Local $p = ""
While $d
$p &= Chr(Dec(StringLeft($d, 2)))
$d = StringTrimLeft($d, 2)
WEnd
Return $p
EndFunc   ;==>MakePacket
Func Parse_Time($bdata)
$unsignedHexValue = StringMid($bdata, 83, 8)
$value = UnsignedHexToDec($unsignedHexValue)
$TZinfo = _Date_Time_GetTimeZoneInformation()
$UTC = _DateAdd("s", $value, "1900/01/01 00:00:00")
ConsoleWrite($UTC & @CRLF)
If $TZinfo[0] <> 2 Then ; 0 = Daylight Savings not used in current time zone / 1 = Standard Time
$TZoffset = ($TZinfo[1]) * - 1
Else ; 2 = Daylight Savings Time
$TZoffset = ($TZinfo[1] + $TZinfo[7]) * - 1
EndIf
$UTC = _DateAdd("n", $TZoffset, $UTC)
$m = StringMid($UTC, 6, 2)
$d = StringMid($UTC, 9, 2)
$y = StringMid($UTC, 1, 4)
$h = StringMid($UTC, 12, 2)
$mi = StringMid($UTC, 15, 2)
$s = StringMid($UTC, 18, 2)
EndFunc
Func UnsignedHexToDec($n)
$ones = StringRight($n, 1)
$n = StringTrimRight($n, 1)
Return Dec($n) * 16 + Dec($ones)
EndFunc   ;==>UnsignedHexToDec

请求数据包的说明在这里。

最新更新