2012-09-30 18 views
11

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

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

¿Por qué no utiliza ntplib? http://pypi.python.org/pypi/ntplib/ –

Respuesta

4

Debe ser

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

En lugar de

msg = 'time' 

Pero como dijo Maksym, debería usar ntplib en su lugar.

1

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

17

Uso ntplib:

Lo siguiente debe trabajar en ambos Python 2 y 3:

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

de salida:

Fri Jul 28 01:30:53 2017 
+0

Muchas gracias chicos, incluí el archivo de la biblioteca: desde tiempo de importación ctime y funcionó bien –

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

Aunque esto puede responder a la pregunta (no estoy seguro), generalmente es mejor para incluir alguna explicación sobre por qué (y cómo) esto resuelve el problema. Esto se aplica especialmente al responder una pregunta que se hizo hace más de un año y que ya tiene [una respuesta similar] (http://stackoverflow.com/a/12664634/466862) –

9

Aquí es 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 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(" "," ") 
+0

Tema antiguo, pero esta es una solución buena y rápida para en lugar de tratar de descubrir cómo agregar módulos a mi sistema de compilación (Petalinux). –

Cuestiones relacionadas