You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

52 lines
1.5 KiB

  1. import socket
  2. import json
  3. IP_ADDR = "0.0.0.0"
  4. PORT = 50000
  5. MSS = 24000 # MSS = Server buffer size (20480) - data header size (4)
  6. class RR:
  7. type = ''
  8. key = ''
  9. value = ''
  10. def __init__(self, type, key, value):
  11. self.type = type
  12. self.key = key
  13. self.value = value
  14. def json_str(self):
  15. return json.dumps(self.__dict__)
  16. if __name__ == "__main__":
  17. server_port = PORT
  18. records = (RR('A', 'example.com', '1.2.3.4'), RR('PTR', '1.2.3.4', 'example.com'))
  19. with socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM) as s:
  20. s.bind((IP_ADDR, server_port))
  21. print(f'Listening on {IP_ADDR}:{server_port}...')
  22. try:
  23. while True:
  24. data, addr = s.recvfrom(MSS)
  25. query = json.loads(data)
  26. print(f'Client {query}')
  27. ok = False
  28. for record in records:
  29. if record.type == query['type'] and record.key == query['key']:
  30. print('Server: Record found. Sending answer.')
  31. s.sendto(record.json_str().encode(), addr)
  32. ok = True
  33. break
  34. if ok == False:
  35. print('Server: Record not found. Sending error.')
  36. record = RR(query['type'], query['key'], 'NXDOMAIN')
  37. s.sendto(record.json_str().encode(), addr)
  38. except KeyboardInterrupt:
  39. print('Server: Interrupted by user. Exiting')
  40. exit(0)