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

时间:2017-08-21 07:06:47

标签: autoit

我需要使用autoit从本地ntp timeserver获取时间。

; 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保持等于""

1 个答案:

答案 0 :(得分:0)

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

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

#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

请求包here的说明。