add new function to close socket

This commit is contained in:
Yann Leboulanger 2014-06-01 15:42:06 +02:00
parent a170fd4b83
commit f5e7b812bf
1 changed files with 43 additions and 28 deletions

View File

@ -365,6 +365,28 @@ class SocksQueue:
elif self.progress_transfer_cb is not None:
self.progress_transfer_cb(actor.account, actor.file_props)
def remove_receiver_by_key(self, key, do_disconnect=True):
reader = self.readers[key]
self.idlequeue.unplug_idle(reader.fd)
self.idlequeue.remove_timeout(reader.fd)
if do_disconnect:
reader.disconnect()
else:
if reader.streamhost is not None:
reader.streamhost['state'] = -1
del(self.readers[key])
def remove_sender_by_key(self, key, do_disconnect=True):
sender = self.senders[key]
if do_disconnect:
sender.disconnect()
else:
self.idlequeue.unplug_idle(sender.fd)
self.idlequeue.remove_timeout(sender.fd)
del(self.senders[key])
if self.connected > 0:
self.connected -= 1
def remove_receiver(self, idx, do_disconnect=True, remove_all=False):
"""
Remove reciver from the list and decrease the number of active
@ -373,20 +395,10 @@ class SocksQueue:
if idx != -1:
for key in self.readers.keys():
if idx in key:
reader = self.readers[key]
self.idlequeue.unplug_idle(reader.fd)
self.idlequeue.remove_timeout(reader.fd)
if do_disconnect:
reader.disconnect()
del self.readers[key]
if not remove_all:
break
else:
if reader.streamhost is not None:
reader.streamhost['state'] = -1
del(self.readers[key])
if not remove_all:
break
self.remove_receiver_by_key(key,
do_disconnect=do_disconnect)
if not remove_all:
break
def remove_sender(self, idx, do_disconnect=True, remove_all=False):
"""
@ -396,24 +408,27 @@ class SocksQueue:
if idx != -1:
for key in self.senders.keys():
if idx in key:
sender = self.senders[key]
if do_disconnect:
sender.disconnect()
if not remove_all:
break
else:
self.idlequeue.unplug_idle(sender.fd)
self.idlequeue.remove_timeout(sender.fd)
del(self.senders[key])
if self.connected > 0:
self.connected -= 1
if not remove_all:
break
self.remove_sender_by_key(key, do_disconnect=do_disconnect)
if not remove_all:
break
if len(self.senders) == 0 and self.listener is not None:
self.listener.disconnect()
self.listener = None
self.connected -= 1
def remove_by_mode(self, sid, mode, do_disconnect=True):
for (key, sock) in self.senders.items():
if key[0] == sid and sock.mode == mode:
self.remove_sender_by_key(key)
for (key, sock) in self.readers.items():
if key[0] == sid and sock.mode == mode:
self.remove_receiver_by_key(key)
def remove_server(self, sid, do_disconnect=True):
self.remove_by_mode(sid, 'server')
def remove_client(self, sid, do_disconnect=True):
self.remove_by_mode(sid, 'client')
class Socks5(object):
def __init__(self, idlequeue, host, port, initiator, target, sid):
@ -770,7 +785,7 @@ class Socks5(object):
self.close_file()
self.idlequeue.remove_timeout(self.fd)
self.idlequeue.unplug_idle(self.fd)
if self.mode == 'server':
if self.mode == 'server' and self.queue.listener:
try:
self.queue.listener.connections.remove(self._sock)
except ValueError: