Подтвердить что ты не робот

Клиент ntp в python

Я написал ntp-клиент в python для запроса сервера времени и отображения времени и выполнения программы, но не дает мне никаких результатов. Я использую интегрированную среду разработки python 2.7.3, а моя ОС - Windows 7. Вот код:

# File: Ntpclient.py
from socket import AF_INET, SOCK_DGRAM
import sys
import socket
import struct, time

# # Set the socket parameters 

host = "pool.ntp.org"
port = 123
buf = 1024
address = (host,port)
msg = 'time'


# reference time (in seconds since 1900-01-01 00:00:00)
TIME1970 = 2208988800L # 1970-01-01 00:00:00

# connect to server
client = socket.socket( AF_INET, SOCK_DGRAM)
client.sendto(msg, address)
msg, address = client.recvfrom( buf )

t = struct.unpack( "!12I", data )[10]
t -= TIME1970
print "\tTime=%s" % time.ctime(t)
4b9b3361

Ответ 1

Используйте ntplib:

Следующее должно работать как на Python 2, так и на 3:

import ntplib
from time import ctime
c = ntplib.NTPClient()
response = c.request('pool.ntp.org')
print(ctime(response.tx_time))

Вывод:

Fri Jul 28 01:30:53 2017

Ответ 2

Вот решение для вышеупомянутого решения, которое добавляет доли секунды в реализацию и правильно закрывает сокет. Поскольку на самом деле это всего лишь несколько строк кода, я не хотел добавлять другую зависимость к моему проекту, хотя ntplib, по общему признанию, вероятно, является способом выхода в большинстве случаев.

#!/usr/bin/env python
from contextlib import closing
from socket import socket, AF_INET, SOCK_DGRAM
import sys
import struct
import time

NTP_PACKET_FORMAT = "!12I"
NTP_DELTA = 2208988800L # 1970-01-01 00:00:00
NTP_QUERY = '\x1b' + 47 * '\0'  

def ntp_time(host="pool.ntp.org", port=123):
        with closing(socket( AF_INET, SOCK_DGRAM)) as s:
            s.sendto(NTP_QUERY, (host, port))
            msg, address = s.recvfrom(1024)
        unpacked = struct.unpack(NTP_PACKET_FORMAT,
                       msg[0:struct.calcsize(NTP_PACKET_FORMAT)])
        return unpacked[10] + float(unpacked[11]) / 2**32 - NTP_DELTA


if __name__ == "__main__":
    print time.ctime(ntp_time()).replace("  "," ")

Ответ 3

Это должно быть

msg = '\x1b' + 47 * '\0' 

Вместо

msg = 'time'

Но, как сказал Максим, вместо этого вы должны использовать ntplib.

Ответ 4

Извините, если мой ответ не удовлетворит ваши ожидания. Я думаю, что имеет смысл использовать существующее решение. ntplib - неплохая библиотека для работы с серверами NTP.

Ответ 5

msg = '\x1b' + 47 * '\0'
.......
t = struct.unpack( "!12I", msg )[10]