def _internal_send_packet(server, port, version, packet=None): if not packet: packet = NTPPacket(transmit=time.time() + NTPClient.FORMAT_DIFF) answer = NTPPacket(version_number=version) with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.settimeout(NTPClient.WAITING_TIME) s.sendto(packet.pack(), (server, port)) data = s.recv(48) arrive_time = time.time() + NTPClient.FORMAT_DIFF answer.unpack(data) return answer, arrive_time
def fake_server(address): s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind( (address, 123) ) drift_start = time.time() speed = 0.9996 while True: packet, source = s.recvfrom(100) print('Received {length} byte packet from {source}'.format(length=len(packet), source=source[0])) packet = NTPPacket.from_bytes(packet) if packet.version not in (3, 4): print('Unsupported NTP version.') continue if packet.mode != 3: print('Not a client request.') continue try: print('Client time:', packet.transmit_timestamp) except: pass time_since_start = time.time() - drift_start return_time = drift_start + time_since_start * speed response = NTPPacket() response.version = packet.version response.mode = 4 response.stratum = 1 response.reference_identifier = b'XFAK' response.origin_timestamp = packet.transmit_timestamp response.reference_timestamp = NTPTimestamp.from_unix_timestamp(return_time) response.receive_timestamp = NTPTimestamp.from_unix_timestamp(return_time) response.transmit_timestamp = NTPTimestamp.from_unix_timestamp(return_time) response = response.to_bytes() s.sendto(response, source)
def run_server(delay, port): with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock: try: sock.bind(("127.0.0.1", port)) except Exception: print("Can not create server (sure port is free)") return while True: data, address = sock.recvfrom(1024) print("Connected: ", address) try: packet = NTPPacket().unpack(data) except UnpackError: print("Wrong packet format") sock.sendto(b"Wrong packet format", address) continue thread = threading.Thread(target=handle_connection, args=(packet, sock, address, delay)) thread.start()