Автор Тема: Получение даты и времени по протоколу NTP  (Прочитано 6215 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Функция довольно простая, если внимательно изучить работу протокола NTP (ссылка в комментариях). А так, просто указываем адрес NTP-сервера и получаем дату и время в виде структуры FILETIME (см. пример).

Код: AutoIt [Выделить]
#Include <StructureConstants.au3>
#Include <Date.au3>

Func _NTP_FT($sServer, $fLocal = True)

;~  http://book.itep.ru/4/44/sntp4416.htm

    Local $tNTP = DllStructCreate('byte Header[4];byte RootDelay[4];byte RootDispersion[4];byte ReferenceIdentifier[4];byte ReferenceTimestamp[8];byte OriginateTimestamp[8];byte ReceiveTimestamp[8];byte TransmitTimestamp[8];byte KeyIdentifier[4];byte MessageDigest[16]')
    Local $tPacket = DllStructCreate('byte Packet[68]', DllStructGetPtr($tNTP))
    Local $bPacket = 0, $tFT, $tQW, $aSocket, $aResult

;~  0x1B000000 = 00011011 00000000 00000000 00000000b (LI = 00b VN = 011b Mode = 011b Stratum = 00000000b Poll = 00000000b Precision = 00000000b)
    $tNTP.Header = Binary('0x1B000000')
    UDPStartup()
    If @Error Then
        Return SetError(1, 0, 0)
    EndIf
    $aSocket = UDPOpen(TCPNameToIP($sServer), 123)
    If @Error Then
        ; Nothing
    Else
        UDPSend($aSocket, $tPacket.Packet)
        If @Error Then
            ; Nothing
        Else
            While 1
                $bPacket = UDPRecv($aSocket, 68, 1)
                If (@Error) Or ($bPacket) Then
                    ExitLoop
                EndIf
                Sleep(100)
            WEnd
        EndIf
    EndIf
    UDPCloseSocket($aSocket)
    UDPShutdown()
    If Not $bPacket Then
        Return SetError(2, 0, 0)
    EndIf
    $tFT = DllStructCreate($tagFILETIME)
    If $fLocal Then
        $tQW = DllStructCreate('uint64 Timestamp')
    Else
        $tQW = DllStructCreate('uint64 Timestamp', DllStructGetPtr($tFT))
    EndIf
    $tPacket.Packet = $bPacket
;~  $tQW.Timestamp = _WinAPI_SwapDWord(DllStructGetData(DllStructCreate('uint', DllStructGetPtr($tNTP, 'TransmitTimestamp')), 1)) * 10000000 + 94354848000000000
    $tQW.Timestamp = Dec(StringMid(DllStructGetData($tNTP, 'TransmitTimestamp'), 3, 8), 2) * 10000000 + 94354848000000000
    If $fLocal Then
        $aResult = DllCall('kernel32.dll', 'bool', 'FileTimeToLocalFileTime', 'struct*', $tQW, "struct*", $tFT)
        If (@Error) Or (Not $aResult[0]) Then
            Return SetError(3, 0, 0)
        EndIf
    EndIf
    Return $tFT
EndFunc   ;==>_NTP_FT

$tFT = _NTP_FT('pool.ntp.org')

ConsoleWrite(_Date_Time_FileTimeToStr($tFT) & @CRLF)



Думай, прежде чем говорить.

Русское сообщество AutoIt

Получение даты и времени по протоколу NTP
« Отправлен: Июль 30, 2015, 17:00:54 »

Оффлайн Kasper [?]

  • Новичок
  • *
  • Сообщений: 70
  • Репутация: 8
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Получение даты и времени по протоколу NTP
« Ответ #1, Отправлен: Август 25, 2015, 13:36:30 »
Не работает функция.
Проверял на этих серверах и везде получал пустой результат
pool.ntp.org
ntp1.stratum2.ru
ntp2.stratum2.ru
ntp1.stratum1.ru
ntp2.stratum1.ru

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2696
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Получение даты и времени по протоколу NTP
« Ответ #2, Отправлен: Август 25, 2015, 13:54:38 »
Только что проверил ваши сервера, все рабочие. Ищите проблему у себя. Возможно что-то блокирует 123-ий порт UDP.

Русское сообщество AutoIt

Re: Получение даты и времени по протоколу NTP
« Ответ #2 Отправлен: Август 25, 2015, 13:54:38 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
24 Ответов
21004 Просмотров
Последний ответ Февраль 26, 2014, 20:58:26
от black1
13 Ответов
11487 Просмотров
Последний ответ Август 24, 2012, 23:54:50
от joiner
13 Ответов
7051 Просмотров
Последний ответ Октябрь 03, 2015, 09:21:10
от madmasles
2 Ответов
9770 Просмотров
Последний ответ Март 30, 2012, 02:50:25
от WSWR
7 Ответов
3414 Просмотров
Последний ответ Июнь 26, 2014, 23:28:17
от alex33
1 Ответов
1883 Просмотров
Последний ответ Август 17, 2014, 09:26:30
от WSWR
0 Ответов
1370 Просмотров
Последний ответ Февраль 16, 2015, 17:30:38
от itskun
1 Ответов
2710 Просмотров
Последний ответ Март 24, 2015, 20:06:35
от madmasles
0 Ответов
1061 Просмотров
Последний ответ Август 11, 2016, 14:55:26
от tamirlan1
3 Ответов
1502 Просмотров
Последний ответ Февраль 02, 2018, 07:01:41
от Astel064