2012-09-30 27 views
11

Tôi đã viết một máy khách ntp trong python để truy vấn một máy chủ thời gian và hiển thị thời gian và chương trình thực hiện nhưng không cho tôi bất kỳ kết quả nào. Tôi đang sử dụng 2.7.3 môi trường phát triển tích hợp python và hệ điều hành của tôi là Windows 7. Đây là mã:Máy khách ntp trong 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

Tại sao bạn không sử dụng ntplib? http://pypi.python.org/pypi/ntplib/ –

Trả lời

4

Nó phải là

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

Thay vì

msg = 'time' 

Nhưng như Maksym nói bạn nên sử dụng ntplib thay thế.

1

Xin lỗi nếu câu trả lời của tôi không thỏa mãn mong đợi của bạn. Tôi nghĩ rằng nó có ý nghĩa để sử dụng một giải pháp hiện có. ntplib là một thư viện khá tốt để làm việc với các máy chủ NTP.

17

Sử dụng ntplib:

Sau đây sẽ làm việc trên cả hai Python 2 và 3:

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

Output:

Fri Jul 28 01:30:53 2017 
+0

Rất cám ơn các bạn đã bao gồm tệp thư viện: từ thời gian nhập ctime và nó hoạt động tốt –

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

Mặc dù điều này có thể trả lời câu hỏi (tôi không chắc chắn), nó thường tốt hơn để bao gồm một số giải thích là tại sao (và làm thế nào) điều này giải quyết vấn đề. Điều này đặc biệt áp dụng khi trả lời một câu hỏi đã được hỏi hơn một năm trước và đã có [một câu trả lời tương tự] (http://stackoverflow.com/a/12664634/466862) –

9

Đây là một sửa chữa cho các giải pháp trên, thêm phân số giây để thực hiện và đóng ổ cắm đúng cách. Vì nó thực sự chỉ là một vài dòng mã, tôi không muốn thêm một phụ thuộc vào dự án của tôi, mặc dù ntplib thừa nhận có lẽ là cách để đi trong hầu hết các trường hợp.

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

Chủ đề cũ, nhưng đây là một giải pháp tốt, nhanh chóng cho tôi thay vì cố gắng tìm ra cách thêm mô-đun vào hệ thống xây dựng của tôi (Petalinux). –

Các vấn đề liên quan