2012-09-30 7 views
11

Ich habe einen NTP-Client in Python geschrieben, um einen Zeitserver abzufragen und die Zeit anzuzeigen, und das Programm wird ausgeführt, aber gibt mir keine Ergebnisse. Ich verwende die Python 2.7.3 integrierte Entwicklungsumgebung und mein OS ist Windows 7. Hier ist der Code:NTP-Client in 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

Warum verwenden Sie nicht ntplib? http://pypi.python.org/pypi/ntplib/ –

Antwort

4

Es sollte

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

sein statt

msg = 'time' 

Aber wie Maksym sagte, sollten Sie stattdessen ntplib verwenden.

1

Entschuldigung, wenn meine Antwort nicht Ihren Erwartungen entspricht. Ich denke, es ist sinnvoll, eine bestehende Lösung zu verwenden. ntplib ist eine ziemlich gute Bibliothek für die Arbeit mit NTP-Servern.

17

Verwendung ntplib:

Folgendes sollte sowohl auf 2 Python arbeiten und 3:

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

Ausgang:

Fri Jul 28 01:30:53 2017 
+0

Vielen Dank Jungs ich die Bibliotheksdatei enthalten: von Zeit importieren ctime und es hat gut funktioniert –

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

Obwohl dies die Frage beantworten kann (ich bin mir nicht sicher), ist es normalerweise besser um eine Erklärung zu geben, warum (und wie) dies das Problem löst. Dies gilt insbesondere für die Beantwortung einer Frage, die vor mehr als einem Jahr gestellt wurde und bereits [eine ähnliche Antwort] (http://stackoverflow.com/a/12664634/466862) –

9

Hier ist ein Update für die oben genannte Lösung, Das fügt der Implementierung Bruchteile von Sekunden hinzu und schließt den Socket ordnungsgemäß. Da es nur eine Handvoll Codezeilen ist, wollte ich meinem Projekt keine weitere Abhängigkeit hinzufügen, obwohl es wahrscheinlich in den meisten Fällen ntplib ist.

#!/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

Old Thread, aber das ist eine gute, schnelle Lösung für ich statt zu versuchen, herauszufinden, wie Module in mein Build-System (Petalinux) hinzufügen. –