fully working version
parent
11b7ec1ee2
commit
8ef5153e2e
35
mods/utcp.py
35
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)
|
||||
|
|
Loading…
Reference in New Issue