diff --git a/runserver/__main__.py b/runserver/__main__.py index 15881cc3dcb4992ab13188281b68c56e28c7a3b2..ac16d16a47870392b5af7212387f04fa91cfd1ad 100644 --- a/runserver/__main__.py +++ b/runserver/__main__.py @@ -3,11 +3,9 @@ def tesserver(): app.config['ENABLELAUNCH'] = True from flask_cors import CORS, cross_origin CORS(app, supports_credentials=True, origin="*") - print("try to run tesserver") app.run(host='localhost',debug=False,port=8080) - print('app is running') -def tws(): +def tws(stop=None): from twsproxy import server import sys import os @@ -19,21 +17,29 @@ def tws(): port = int(sys.argv[1]) except: port = 8090 - server = server.TWSServer(port,5) - logger.debug("initialised server object") + server = server.TWSServer(port,5,stop) server.run() +def stopThreads(signum,frame,event,old_handler): + import logging + logger = logging.getLogger() + event.set() + if callable(old_handler): + old_handler(signum,frame) + return def main(): import logging + import signal logging.basicConfig(filename="tes.log",format="%(asctime)s %(levelname)s:%(process)s: %(message)s") logger=logging.getLogger() logger.setLevel(logging.DEBUG) + old_handler = signal.getsignal(signal.SIGINT) + signal.signal(signal.SIGINT, lambda x,y: stopThreads(x,y,stop,old_handler)) import threading - print("create thread") - twsthread = threading.Thread(target=tws) + stop=threading.Event() + twsthread = threading.Thread(target=tws,args=[stop]) twsthread.start() - print("thread started") tesserver() twsthread.join() diff --git a/twsproxy/__init__.py b/twsproxy/__init__.py index 6051cc4a6ce3ecf6db587e3d0ef5158b0d13f23c..4f4492df9b4cb75363ee646ec246bb12e1ed83dc 100644 --- a/twsproxy/__init__.py +++ b/twsproxy/__init__.py @@ -126,55 +126,6 @@ class TWSProxy(threading.Thread): raise RuntimeError("socket connection broken") totalsent = totalsent + sent - @staticmethod - def twosocks(client,server,initshutdown): - import threading - logger=logging.getLogger() - closed = False - clientopen = True - serveropen = True - shuttype = socket.SHUT_RD - while serveropen or clientopen: - r,w,e = select.select([client,server],[],[],TWSProxy.TIMEOUT) - if client in r: - try: - buff = client.recv(TWSProxy.MAXBUFF) - msglength = len(buff) - if msglength > 0: - TWSProxy.reliablesend(server,buff,msglength) - else: - clientopen = False - server.shutdown(shuttype) - except: - clientopen = False - if server in r: - try: - buff = server.recv(TWSProxy.MAXBUFF) - msglength = len(buff) - if msglength > 0: - TWSProxy.reliablesend(client,buff,msglength) - else: - client.shutdown(shuttype) -# print("server closed socket for reading") - serveropen = False - except: - serveropen = False - # If the client has finished sending, and we've finished transmitting to the server - # The server may still have some data to transmit to the client - closed = False - while not closed: - r,w,e = select.select([server],[],[],TWSProxy.TIMEOUT) - buff = server.recv(TWSProxy.MAXBUFF) - msglength = len(buff) - if msglength > 0: - try: - TWSProxy.reliablesend(client,buff,msglength) - except BrokenPipeError as e: - pass - else: - closed = True - - @staticmethod def sockcopy(src,dest,initshutdown): diff --git a/twsproxy/server/__init__.py b/twsproxy/server/__init__.py index 6417d4de6d188fd5e5e6e3d714872d8287bcebbb..5c522f0c30f27fecfd02e10e8e220ee6312a43b9 100644 --- a/twsproxy/server/__init__.py +++ b/twsproxy/server/__init__.py @@ -4,24 +4,24 @@ import logging class TWSServer: import socket - def __init__(self,port,maxconn): + def __init__(self,port,maxconn,stop=None): self.port = port - print('init tws proxy') - print(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) - print(serversocket) + 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: - print('try bind to {}'.format(port)) serversocket.bind(('0.0.0.0', port)) - print("bind success") #become a server socket serversocket.listen(self.maxconn) break @@ -30,8 +30,11 @@ class TWSServer: print(e) pass openconnections = [] - while 1: - (clientsocket, address) = serversocket.accept() + while not self.stop.is_set(): + try: + (clientsocket, address) = serversocket.accept() + except socket.timeout: + continue clientsocket.setblocking(True) tunnel = TWSProxy(clientsocket) tunnel.daemon = True @@ -42,3 +45,4 @@ class TWSServer: c.join() openconnections.remove(c) + serversocket.close()