用Python实现SNTP

-- TOC --

这是一段可能会比较有用的代码,python实现的sntp,可以通过网络查询NTP服务器的时间。

$ cat sntp.py
import time
import socket
import struct


def sntp_client(server):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.settimeout(2)
    msg = b'\x1b' + b'\x00'*47
    s.sendto(msg, (server, 123))
    rcv, addr = s.recvfrom(1024)
    if rcv:
        print('response received from', addr)
        t = struct.unpack('!12I', rcv)[10]
        return t - 2208988800  # TIME1970


print(time.ctime(sntp_client('time.pool.aliyun.com')))

运行效果:

$ python3 sntp.py
response received from ('182.92.12.11', 123)
Fri Mar 18 09:13:14 2022
$ python3 sntp.py
response received from ('182.92.12.11', 123)
Fri Mar 18 09:13:15 2022
$ python3 sntp.py
response received from ('182.92.12.11', 123)
Fri Mar 18 09:13:16 2022

注意:

  1. socket发送数据时,addr可以是域名,但接收时的addr是ip;
  2. bytes对象也可以用*的方式来实现复制;
  3. time.ctime的输出很nice!
  4. struct.unpack这行代码可以优化,不用unpack出12个interger。

这段代码有可能在recvfrom的地方阻塞超时,很可能是server没有响应,网络上有很多ntp server可以使用,可自行搜索。

本文链接:https://cs.pynote.net/net/202203181/

-- EOF --

-- MORE --