tcp_socket.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import socket
  2. import threading
  3. import time
  4. from tcp_packet import TCPPacket
  5. from ip_layer import IPLayer
  6. # from utils import net_params
  7. class TCPSocket:
  8. _localport = 1234
  9. _ip_layer = None
  10. ip = None # ip назначения
  11. port = None # port назначения
  12. next_seq_num = 0
  13. next_ack_num = 0
  14. send_data = ""
  15. recv_data = ""
  16. def __init__(self, ip_layer):
  17. self._ip_layer = ip_layer
  18. recv_thread = threading.Thread(target=self._recv_thread, daemon=True)
  19. send_thread = threading.Thread(target=self._send_thread, daemon=True)
  20. recv_thread.start()
  21. send_thread.start()
  22. def send(self, data):
  23. self.send_data += data
  24. def _send(self, packet):
  25. packet.SEQ = self.next_seq_num
  26. if packet.ACK == 1:
  27. packet.ACK = self.next_ack_num
  28. if (packet.f_SYN == 1 or packet.f_FIN == 1):
  29. self.next_seq_num = self.next_seq_num + 1
  30. elif (packet.f_ACK == 1 and len(packet.DATA) == 0):
  31. self.next_seq_num = self.next_seq_num
  32. elif (len(packet.DATA) != 0):
  33. self.next_seq_num = self.next_seq_num + len(packet.DATA)
  34. self._ip_layer.send(self.ip, packet.to_hex_string())
  35. def _recv_thread(self):
  36. while True:
  37. # print("This is recv thread")
  38. time.sleep(2)
  39. def _send_thread(self):
  40. while True:
  41. # print("This is send thread")
  42. time.sleep(1)
  43. def connect(self, ip, port):
  44. self.ip = ip
  45. self.port = port
  46. # print("Opening connection")
  47. # send SYN
  48. syn = self.make_tcp_packet()
  49. syn.f_SYN = 1
  50. print(syn)
  51. self._send(syn)
  52. def make_tcp_packet(self):
  53. packet = TCPPacket()
  54. packet.set_ip(IPLayer.get_ip_address(), self.ip)
  55. packet.SRC = self._localport # type: ignore
  56. packet.DST = self.port # type: ignore
  57. return packet
  58. def main():
  59. ip_layer = IPLayer()
  60. sock = TCPSocket(ip_layer)
  61. sock.connect("8.8.8.8", 80)
  62. # lock_net = LocalNetwork()
  63. # print(lock_net.get_ip()) # type: ignore
  64. if __name__ == "__main__":
  65. main()