2012-09-30 18 views
11

Napisałem klienta ntp w pythonie, aby wysłać zapytanie do serwera czasu i wyświetlić czas i program, ale nie daje mi żadnych wyników. używam 2.7.3 zintegrowanego środowiska programistycznego Python i mój system operacyjny to Windows 7. Oto kod:Klient ntp w pytonie

# 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

Dlaczego nie używasz ntplib? http://pypi.python.org/pypi/ntplib/ –

Odpowiedz

4

Powinno być

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

Zamiast

msg = 'time' 

Ale jak powiedział Maksym, powinieneś użyć ntplib zamiast tego.

1

Przepraszam, jeśli moja odpowiedź nie spełnia Twoich oczekiwań. Myślę, że sensowne jest użycie istniejącego rozwiązania. ntplib to całkiem dobra biblioteka do pracy z serwerami NTP.

17

Zastosowanie ntplib:

Poniższa powinien pracować zarówno Python 2 i 3:

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

wyjściowa:

Fri Jul 28 01:30:53 2017 
+0

Wielkie dzięki chłopaki zawarłem plik biblioteki: od czasu import ctime i działało dobrze –

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

Chociaż może to odpowiedzieć na pytanie (nie jestem pewien), zazwyczaj jest lepiej w celu wyjaśnienia, dlaczego (i w jaki sposób) rozwiązuje to problem. Dotyczy to w szczególności odpowiedzi na pytanie zadane ponad rok temu i ma już [podobną odpowiedź] (http://stackoverflow.com/a/12664634/466862) –

9

Oto poprawka do powyższego roztworu, co dodaje ułamki sekund do implementacji i prawidłowo zamyka gniazdo. Ponieważ w rzeczywistości jest to zaledwie garstka linii kodu, nie chciałem dodawać do mojego projektu innej zależności, choć w większości przypadków jest to prawdopodobnie sposób na przejście.

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

Stary wątek, ale jest to dobre, szybkie rozwiązanie dla zamiast próbować dowiedzieć się, jak dodać moduły do ​​mojego systemu kompilacji (Petalinux). –