From 8ef5153e2ef03dff807134d16ec1e97b6871efbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=BE=D0=BC=D0=B0=D0=BD=20=D0=91=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D0=BD?= Date: Mon, 8 Apr 2019 23:38:35 +0300 Subject: [PATCH] fully working version --- mods/utcp.py | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/mods/utcp.py b/mods/utcp.py index cad67b3..7d6eea6 100644 --- a/mods/utcp.py +++ b/mods/utcp.py @@ -242,6 +242,8 @@ class TCP(object): self.port = addr[1] self.own_socket.bind(addr) def send(self, data, connection=None): + if self.closed: + raise EOFError try: if connection not in list(self.connections.keys()): if connection is None: @@ -259,6 +261,8 @@ class TCP(object): except socket.error as error: raise EOFError('Socket was closed before executing command. Error is: %s.' % error) def recv(self, size, connection=None): + if self.closed: + raise EOFError try: if connection not in list(self.connections.keys()): if connection is None: @@ -327,10 +331,12 @@ class TCP(object): t.start() except Exception as error: raise EOFError('Something went wrong in listen func! Error is: %s.' % str(error)) - + def stop(self): + self.own_socket.close() + self.status = 0 def accept(self): - try: - while True: + while self.status: + try: self.new_conn_event.wait(0.1) if self.connection_queue: with self.queue_lock: @@ -341,9 +347,14 @@ class TCP(object): syn_ack.set_pub(conn.peer_pub.encrypt_raw(conn.pubkey)) answer = self.__send_packet(conn.peer_addr, syn_ack, retransmit=True) return ConnectedSOCK(self, conn.peer_addr), conn.peer_addr - except Exception as error: - self.close(conn.peer_addr) - raise EOFError('Something went wrong in accept func: ' + str(error)) + except EOFError: + if conn.peer_addr in self.connections: + self.close(conn.peer_addr) + continue + except Exception as error: + if conn.peer_addr in self.connections: + self.close(conn.peer_addr) + raise EOFError('Something went wrong in accept func: ' + str(error)) def connect(self, server_address=('127.0.0.1', 10000)): try: @@ -380,7 +391,7 @@ class TCP(object): return self.own_socket.fileno() @property def closed(self): - return self.own_socket._closed + return not bool(len(self.connections)) def drop_connection(self, connection): with self.connection_lock: if len(self.connections): @@ -398,12 +409,9 @@ class TCP(object): if not answer: raise Exception('The receiver didn\'t send the fin packet') else: - ack = Ack(fin.id) - self.__send_packet(connection, ack) self.drop_connection(connection) if len(self.connections) == 0 and self.client: - self.own_socket.close() - self.status = 0 + self.stop() except Exception as error: raise EOFError('Something went wrong in the close func! Error is: %s.' % error) @@ -413,7 +421,7 @@ class TCP(object): self.__send_packet(connection, ack) fin_ack = FinAck(fin_id) try: - answer = self.__send_packet(connection, fin_ack, retransmit=True) + answer = self.__send_packet(connection, fin_ack) except: pass with self.connection_lock: @@ -473,7 +481,7 @@ class TCP(object): return packet except KeyError: not_found = True - self.incoming_packet_event.wait(0.1) + self.incoming_packet_event.wait(0.5) def blink_incoming_packet_event(self): self.incoming_packet_event.set() self.incoming_packet_event.clear() @@ -526,7 +534,6 @@ class TCP(object): except socket.error as error: self.own_socket.close() self.status = 0 - # print('An error has occured: Socket error %s' % error) def central_receive(self): t = threading.Thread(target=self.central_receive_handler)