NTP的数据格式如下:
现在要在不使用第三方库的条件下,编写一个简单的SNTP Client,参考代码如下:
#!usr/bin/env python
import socket
import struct
import sys
import time
NTP_SERVER = '0.cn.pool.ntp.org'
TIME1970 = 220898800
def sntp_client():
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
data='\x1b'+47*'\0'
client.sendto(data.encode('utf-8'),(NTP_SERVER,123))
data,address=client.recvfrom(1024)
if data:
print('Response received from:',address)
t=struct.unpack('!12I',data)[10]
t-=TIME1970
print('\tTime=%s'%time.ctime(t))
if __name__ == '__main__':
sntp_client()
这段代码我有几个不明白的地方:
data='x1b'+47*'0'是SNTP的请求消息么,这种写法是什么样的格式(16进制应该是0x?x是啥。。。或者说,我要怎么才能把data的内容输出为我可以看懂的形式)?
t=struct.unpack('!12I',data)[10]中,'!12I'是什么意思?我查了一下文档,'!'表示Network(=big-edian),'I'表示int,所以这里是把data的内容(二进制字符串)按照int的方式解释,也就是转换为12个int的形式么?
xhh就是用来表示16进制
data='x1b'+47*'0' 表示48字节的数据其中第一个字节为0x1b,后面47个字节为0x00
直接打印结果就是: 'x1bx00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00x00'
就是按网络字节序解析为12个int,t就是12个int 元素的tuple