1- from socketserver import BaseRequestHandler , TCPServer
1+ from socketserver import BaseRequestHandler , TCPServer , ThreadingMixIn
22from socket import socket , AF_INET , SOCK_STREAM , gethostbyname , error
33import threading
44import logging
@@ -38,30 +38,38 @@ def handle(self):
3838 finally :
3939 sock .close ()
4040
41- def transferData (self , sock1 : socket , sock2 : socket , max_read_try = 1 , receive_message_length = 4096 ):
41+ def transferData (self , sock1 : socket , sock2 : socket , max_read_try = 10 , receive_message_length = 2048 ):
4242 read_try = 0
43+ last_try = False
4344 fcntl .fcntl (sock1 , fcntl .F_SETFL , os .O_NONBLOCK )
4445 while True :
4546 try :
4647 msg = sock1 .recv (receive_message_length )
4748 if not msg :
48- break
49- sock2 .sendall (msg )
50- if len (msg ) < receive_message_length :
5149 return
50+ sock2 .sendall (msg )
51+
52+ read_try = 0
53+ if last_try and len (msg ) > 0 :
54+ last_try = False
55+ if len (msg ) < (receive_message_length / 2 ):
56+ if last_try :
57+ return
58+ else :
59+ last_try = True
5260 except error as e :
5361 err = e .args [0 ]
5462 if err == errno .EAGAIN or err == errno .EWOULDBLOCK :
5563 if read_try > max_read_try :
5664 return
5765 read_try += 1
58- time .sleep (1 )
66+ time .sleep (0. 1 )
5967 continue
6068 raise e
6169
70+ class ThreadedTCPServer (ThreadingMixIn , TCPServer ):
71+ pass
6272
63-
64-
6573class ProxyServer ():
6674
6775 def __init__ (self , proxy_host , proxy_port , type = ProxyType .TCP ):
@@ -77,7 +85,7 @@ class ThreadedTcpProxyHandler(TcpProxySockHandler):
7785 PROXY_HOST = gethostbyname (proxy_host )
7886 PROXY_PORT = proxy_port
7987
80- self .server = TCPServer ((HOST , proxy_port ), ThreadedTcpProxyHandler )
88+ self .server = ThreadedTCPServer ((HOST , proxy_port ), ThreadedTcpProxyHandler )
8189 self .ip , self .port = self .server .server_address
8290 self .logger .info ("Creating %s proxy server with listen on %s and proxy to %s:%s" , type , proxy_port , proxy_host , proxy_port )
8391
0 commit comments