cliente ntp en python

He escrito un cliente ntp en python para consultar un servidor de tiempo y mostrar la hora y el progtwig se ejecuta, pero no me da ningún resultado. Estoy usando el entorno de desarrollo integrado de python 2.7.3 y mi sistema operativo es Windows 7. Aquí está el código:

# 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) 

Utilice ntplib :

Lo siguiente debería funcionar tanto en Python 2 como en 3:

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

Salida:

 Fri Jul 28 01:30:53 2017 

Aquí hay una solución para la solución anterior, que agrega fracciones de segundos a la implementación y cierra el socket correctamente. Como en realidad son solo unas pocas líneas de código, no quería agregar otra dependencia a mi proyecto, aunque es cierto que ntplib es probablemente el camino a seguir en la mayoría de los casos.

 #!/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(" "," ") 

Debería ser

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

En lugar de

 msg = 'time' 

Pero como Maksym dijo que deberías usar ntplib en su lugar.

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

Lo siento si mi respuesta no satisface tus expectativas. Creo que tiene sentido utilizar una solución existente. ntplib es una biblioteca bastante buena para trabajar con servidores NTP.