2012-09-30 11 views
11

Ho scritto un client ntp in python per interrogare un server orario e visualizzare l'ora e il programma viene eseguito ma non mi dà alcun risultato. sto usando 2.7.3 ambiente di sviluppo integrato di pitone e il sistema operativo è Windows 7. Ecco il codice:client ntp 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

Perché non usi ntplib? http://pypi.python.org/pypi/ntplib/ –

risposta

4

Dovrebbe essere

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

Invece di

msg = 'time' 

Ma come ha detto Maksym, dovresti usare invece ntplib.

1

Scusate se la mia risposta non soddisfa le vostre aspettative. Penso che abbia senso usare una soluzione esistente. ntplib è una libreria abbastanza buona per lavorare con i server NTP.

17

Uso ntplib:

Di seguito dovrebbe funzionare sia su Python 2 e 3:

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

uscita:

Fri Jul 28 01:30:53 2017 
+0

Grazie mille ragazzi ho incluso il file della libreria: da tempo import ctime e ha funzionato bene –

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

Anche se questo potrebbe rispondere alla domanda (non sono sicuro), di solito è meglio includere alcune spiegazioni sul perché (e come) risolve il problema. Questo si applica in particolare quando si risponde a una domanda che è stata fatta più di un anno fa e ha già [una risposta simile] (http://stackoverflow.com/a/12664634/466862) –

9

Ecco una correzione per la soluzione di cui sopra, che aggiunge frazioni di secondi all'implementazione e chiude correttamente il socket. Poiché in realtà si tratta solo di una manciata di righe di codice, non volevo aggiungere un'altra dipendenza al mio progetto, anche se la maggior parte dei casi è probabilmente la strada da percorrere per la 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(" "," ") 
+0

Vecchio thread, ma questa è una buona soluzione rapida per io invece di cercare di capire come aggiungere moduli al mio sistema di build (Petalinux). –