用AutoIt实现系统时间与NTP服务器同步

演示代码:

#include "CoProc.au3"
#Include <Misc.au3>
#include <Date.au3>

$ntpServer = "time-nw.nist.gov" ;改为ini配置
local $var1,$var2
    ;Global Const $tagSYSTEMTIME = "short Year;short Month;short Dow;short Day;short Hour;short Minute;short Second;short MSeconds"
    ;Global Const $tagTIME_ZONE_INFORMATION = "dword Bias;byte StdName[64];ushort StdDate[8];dword StdBias;byte DayName[64];ushort DayDate[8];dword DayBias"
dim $TimeZone=8*60*60
UDPStartup()
Dim $socket = UDPOpen(TCPNameToIP($ntpServer), 123)
If @error <> 0 Then
    MsgBox(0,"","连接服务器失败!")
    Exit
EndIf

;$status = UDPSend($socket, MakePacket("1b0e010000000000000000004c4f434ccb1eea7b866665cb00000000000000000000000000000000cb1eea7b866665cb"))
$status = UDPSend($socket, MakePacket("1b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"))
If $status = 0 Then
    MsgBox(4096, "错误", "连接服务器失败,请查看网络连接!")
EndIf

$data=""
$i=0
While $data=""
    $i+=1
    $data = UDPRecv($socket, 100)
    If $i = 5 Then
        MsgBox(4096, "错误", "连接服务器失败,请更换服务器地址!")
        Exit
    EndIf
    sleep(100)
WEnd

UDPCloseSocket($socket)
UDPShutdown()
$unsignedHexValue=StringMid($data,83,8); Extract time from packet. Disregards the fractional second.
$value=UnsignedHexToDec($unsignedHexValue)
$value=$value+$TimeZone
$UTC=_DateAdd("s",$value,"1900/01/01 00:00:00")
$var1=StringSplit(StringLeft($UTC,10),'/')
$var2=StringSplit(StringRight($UTC,8),':')
_SetTime($var2[1],$var2[2],$var2[3])
_SetDate($var1[3],$var1[2],$var1[1])
MsgBox(0,"提示","NTP服务器时间同步成功,当前系统时间为: "&$UTC)

Func MakePacket($d)
    Local $p=""
    While $d
        $p&=Chr(Dec(StringLeft($d,2)))
        $d=StringTrimLeft($d,2)
    WEnd
    Return $p
EndFunc

Func UnsignedHexToDec($n)
    $ones=StringRight($n,1)
    $n=StringTrimRight($n,1)
    Return dec($n)*16+dec($ones)
EndFunc

 

申明:本站资源大部分来自网络,如果无意侵犯了你的权利,请及时通知我们 AutoIt@FoxMail.Com,我们将尽快处理
Copyright © 2008-2009 随便复制 共享精神 人人有责 All Right Reserved
粤ICP备08009024号