fully working version

utcp_uuid
Роман Бородин 2019-04-08 23:38:35 +03:00
parent 11b7ec1ee2
commit 8ef5153e2e
1 changed files with 21 additions and 14 deletions

View File

@ -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)