import socket import json IP_ADDR = "0.0.0.0" PORT = 50000 MSS = 24000 # MSS = Server buffer size (20480) - data header size (4) class RR: type = '' key = '' value = '' def __init__(self, type, key, value): self.type = type self.key = key self.value = value def json_str(self): return json.dumps(self.__dict__) if __name__ == "__main__": server_port = PORT records = (RR('A', 'example.com', '1.2.3.4'), RR('PTR', '1.2.3.4', 'example.com')) with socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) as s: s.bind((IP_ADDR, server_port)) print(f'Listening on {IP_ADDR}:{server_port}...') try: while True: data, addr = s.recvfrom(MSS) query = json.loads(data) print(f'Client {query}') ok = False for record in records: if record.type == query['type'] and record.key == query['key']: print('Server: Record found. Sending answer.') s.sendto(record.json_str().encode(), addr) ok = True break if ok == False: print('Server: Record not found. Sending error.') record = RR(query['type'], query['key'], 'NXDOMAIN') s.sendto(record.json_str().encode(), addr) except KeyboardInterrupt: print('Server: Interrupted by user. Exiting') exit(0)