python 写的简易小ntp 服务器

本文档介绍了如何使用Python编写一个简单的NTP服务器。主要包含ntp.py源代码的实现和setup.py文件的编译过程,同时提到了配置文件settings.json的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ntp.py

# -*- coding: UTF-8 -*-
import wx
import datetime
import socket
import struct
import time
import Queue
import mutex
import threading
import select
import win32api

#全局变量

ntpserverversion = '2018.03.12'
taskQueue = Queue.Queue()
stopFlag = False
utc_offset = 8
stratum = 1
syntime = 0
serverip = '0.0.0.0'
serverport = '123'
poll_interval = 6
version = 3
retry_cnt = 5

#加载配置文件函数
def loadsettingsjsonfile():
	import json
	global stratum,utc_offset,syntime,serverip,serverport,poll_interval,version
	with open('profile/settings.json','r') as fp :
		settings = json.loads(fp.read())
		stratum = settings['stratum']
		utc_offset = settings['utc_offset']
		syntime = settings['syntime']
		serverip = settings['serverip']
		serverport = settings['serverport']
		poll_interval = settings['poll_interval']
		version = settings['version']
		
	del json

def system_to_ntp_time(timestamp):
	"""Convert a system time to a NTP time.

	Parameters:
	timestamp -- timestamp in system time

	Returns:
	corresponding NTP time
	"""
	return timestamp + NTP.NTP_DELTA
def ntp_to_system_time(timestamp):
	"""Convert a system time to a NTP time.

	Parameters:
	timestamp -- timestamp in system time

	Returns:
	corresponding NTP time
	"""
	return timestamp - NTP.NTP_DELTA
	
def setSystemTime(timestamp):    
	tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst = time.gmtime(timestamp)
	# ms一定要计算,不然2次时间校对的过程中会差距几百ms,误差太大!!
	tm_ms = int((timestamp - int(timestamp))*1000)
	win32api.SetSystemTime(tm_year,tm_mon,tm_wday,tm_mday,tm_hour,tm_min,tm_sec,tm_ms)
	
def _to_int(timestamp):
	"""Return the integral part of a timestamp.

	Parameters:
	timestamp -- NTP timestamp

	Retuns:
	integral part
	"""
	return int(timestamp)

def _to_frac(timestamp, n=32):
	"""Return the fractional part of a timestamp.

	Parameters:
	timestamp -- NTP timestamp
	n         -- number of bits of the fractional part

	Retuns:
	fractional part
	"""
	return int((timestamp - _to_int(timestamp)) * 2**n )

def _to_time(integ, frac, n=32):
	"""Return a timestamp from an integral and fractional part.

	Parameters:
	integ -- integral part
	frac  -- fractional part
	n     -- number of bits of the fractional part

	Retuns:
	timestamp
	"""
	return integ + float(frac)/2**n



class NTPException(Exception):
	"""Exception raised by this module."""
	pass


class NTP:
	"""Helper class defining constants."""

	_SYSTEM_EPOCH = datetime.date(*time.gmtime(0)[0:3])
	"""system epoch"""
	_NTP_EPOCH = datetime.date(1900, 1, 1)
	"""NTP epoch"""
	NTP_DELTA = (_SYSTEM_EPOCH - _NTP_EPOCH).days * 24 * 3600
	"""delta between system and NTP time"""
	ref_timestamp = 0
	recv_timestamp = 0 
	orig_timestamp = 0
	orig_timestamp_h = 0
	orig_timestamp_l = 0
	tx_timestamp = 0
	#stratum = 1的时候,ref_id应该是字符串,而不能是ip地址!
	ref_id = 0
	
	REF_ID_TABLE = {
			'DNC': "DNC routing protocol",
			'NIST': "NIST public modem",
			'TSP': "TSP time protocol",
			'DTS': "Digital Time Service",
			'ATOM': "Atomic clock (calibrated)",
			'VLF': "VLF radio (OMEGA, etc)",
			'callsign': "Generic radio",
			'LORC': "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值