import socket from .. import TWSProxy import logging class TWSServer: import socket def __init__(self,port,maxconn,stop=None): import threading self.port = port self.maxconn = maxconn if stop is None: self.stop = threading.Event() else: self.stop = stop def run(self): logger = logging.getLogger() serversocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM) serversocket.settimeout(5) #bind the socket to a public host, # and a well-known port for port in range(self.port,self.port+1): try: serversocket.bind(('0.0.0.0', port)) #become a server socket serversocket.listen(self.maxconn) break except Exception as e: print("bind fail") print(e) pass openconnections = [] while not self.stop.is_set(): try: (clientsocket, address) = serversocket.accept() logger.debug('accepted connection {}'.format(clientsocket)) except socket.timeout: continue clientsocket.setblocking(True) tunnel = TWSProxy(clientsocket) tunnel.daemon = True tunnel.start() openconnections.append(tunnel) for c in openconnections: if not c.is_alive(): c.join() openconnections.remove(c) serversocket.close()