Private Declare Function SetSystemTime Lib "kernel32" _
(lpSystemTime As SYSTEMTIME) As Long
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Dim sNTP As String ' 服务器返回的32位时间标签
Dim TimeDelay As Single '延时
Private Sub cmdExit_Click()
Unload Me
End Sub
'对时
Private Sub cmdSync_Click()
cmdExit.Enabled = False
StinkySock.Close
sNTP = Empty
StinkySock.RemoteHost = Combo1.Text
StinkySock.RemotePort = 37 'NTP servers port
StinkySock.Connect
End Sub
'获取数据
Private Sub StinkySock_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
StinkySock.GetData Data, vbString
sNTP = sNTP & Data
End Sub
'连接时设置延时
Private Sub StinkySock_Connect()
TimeDelay = Timer
End Sub
'关闭时设置时间
Private Sub StinkySock_Close()
On Error Resume Next
Do Until StinkySock.State = sckClosed
StinkySock.Close
DoEvents
Loop
'计算延时
TimeDelay = ((Timer - TimeDelay) / 2)
'设置时间
Call SyncClock(sNTP)
cmdExit.Enabled = True
End Sub
'转换和设置来自NTP的时间
Private Sub SyncClock(tStr As String)
Dim NTPTime As Double
Dim UTCDATE As Date
Dim LngTimeFrom1990 As Long
Dim ST As SYSTEMTIME
tStr = Trim(tStr)
If Len(tStr) <> 4 Then
MsgBox "NTP Server returned an invalid response.", vbCritical, "Invalid Response "
cmdExit.Enabled = True
Exit Sub
End If
NTPTime = Asc(Left$(tStr, 1)) * 256 ^ 3 + Asc(Mid$(tStr, 2, 1)) * 256 ^ 2 + _
Asc(Mid$(tStr, 3, 1)) * 256 ^ 1 + Asc(Right$(tStr, 1))
LngTimeFrom1990 = NTPTime - 2840140800#
UTCDATE = DateAdd("s", CDbl(LngTimeFrom1990 + CLng(TimeDelay)), #1/1/1990#)
'计算时间
ST.wYear = Year(UTCDATE)
ST.wMonth = Month(UTCDATE)
ST.wDay = Day(UTCDATE)
ST.wHour = Hour(UTCDATE)
ST.wMinute = Minute(UTCDATE)
ST.wSecond = Second(UTCDATE)
'设置时间
Call SetSystemTime(ST)
MsgBox "Clock synchronised succesfully.", vbInformation, "Tick Tock"
cmdExit.Enabled = True
End Sub