From b36e74f798e916401261ad1ec1c375d99601c475 Mon Sep 17 00:00:00 2001 From: ranchuan Date: Thu, 23 May 2024 11:14:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B6=E4=B8=AD=E4=B8=80=E6=96=B9=E6=96=AD?= =?UTF-8?q?=E7=BA=BF=E5=90=8E=EF=BC=8C=E9=80=9A=E7=9F=A5=E5=8F=A6=E4=B8=80?= =?UTF-8?q?=E6=96=B9=E6=96=AD=E5=BC=80=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReadMe.txt | 4 ++++ server.py | 1 + target.py | 18 ++++++++++++++++++ target_client.py | 30 ++++++++++++++++++++++++------ target_server.py | 13 +++++++++++-- 5 files changed, 58 insertions(+), 8 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index dacede7..47d9640 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -5,3 +5,7 @@ 2024.5.22 实现端口转发功能,经测试,ssh、http可以正常使用 +2024.5.23 + 其中一方断线后,通知另一方断开连接 + + diff --git a/server.py b/server.py index 009ffda..ae69aa2 100644 --- a/server.py +++ b/server.py @@ -40,6 +40,7 @@ def dispose_client_request(tcp_client_1,tcp_addr): break print(f"客户端:{tcp_addr} 已下线") tcp_client_1.close() + target.close() diff --git a/target.py b/target.py index c2c0582..0fc8f9d 100644 --- a/target.py +++ b/target.py @@ -14,12 +14,14 @@ import prot_codec as pc # device: # server # client +# proxy # 定义操作类型 # option: # connect # disconnect # data # login +# close _tcp_server=None @@ -53,5 +55,21 @@ class tcp_target(object): else: if(_tcp_client is not None): _tcp_client.send(recv_data) + # 只要有一个断了所有的都断开 + def close(self): + cmd={'device':'proxy','option':'close'} + data=pc.encode(json.dumps(cmd).encode('utf-8'),b'default') + # 这里有可能连接已经断开,无法发送 + if(_tcp_client is not None): + try: + _tcp_client.send(data) + except Exception as e: + print("target_close:",str(e)) + if(_tcp_server is not None): + try: + _tcp_server.send(data) + except Exception as e: + print("target_close:",str(e)) + diff --git a/target_client.py b/target_client.py index 9cc9f7f..3be5800 100644 --- a/target_client.py +++ b/target_client.py @@ -23,7 +23,7 @@ _LOCAL_PORT = 31234 _remote_client=None _local_client=[] - +_local_server=None # 发送数据到指定ip地址和端口 @@ -40,9 +40,15 @@ def send_to(ip,port,data:bytearray): def close(ip,port): for item in _local_client: if(item[1]==ip and item[2]==port): + print(f'remote close {ip},{port}') item[0].close() break +# 关闭所有 +def close_all(): + for item in _local_client: + item[0].close() + print('remote close all') @@ -51,6 +57,7 @@ def close(ip,port): def remote_client_handler(tcp_remote:socket): global _remote_client global _local_client + global _local_server print("已连接代理服务器") recv_data=bytearray() cmd={'device':'client','option':'login'} @@ -78,12 +85,18 @@ def remote_client_handler(tcp_remote:socket): send_to(j['ip'],j['port'],data) elif(j['option']=='disconnect'): close(j['ip'],j['port']) + elif(j['device']=='proxy'): + if(j['option']=='close'): + close_all() except Exception as e: print(str(e)) recv_data=recv_data[end+1:] else: break tcp_remote.close() + print("proxy close") + if _local_server is not None: + _local_server.close() # 本地数据处理,解包,把负载数据发送到本地服务器 @@ -123,18 +136,23 @@ def local_client_handler(tcp_server:socket,addr): def main(): global _remote_client global _local_client + global _local_server _remote_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) _remote_client.connect(("1.92.113.30",5345)) thd = threading.Thread(target = remote_client_handler, args = (_remote_client,)) thd.start() - tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) - tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) - tcp_server.bind(("",_LOCAL_PORT)) + _local_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) + _local_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) + _local_server.bind(("",_LOCAL_PORT)) print(f"开始监听({_LOCAL_PORT})") - tcp_server.listen(128) + _local_server.listen(128) while True: - temp , temp_address = tcp_server.accept() + try: + temp , temp_address = _local_server.accept() + except Exception as e: + print("local server:",str(e)) + break thd = threading.Thread(target = local_client_handler, args = (temp,temp_address)) thd.start() diff --git a/target_server.py b/target_server.py index 4a4f186..9015d0f 100644 --- a/target_server.py +++ b/target_server.py @@ -24,8 +24,9 @@ _remote_client=None _local_client=[] -LOCAL_SERVER_IP = ("192.168.3.166",80) +# LOCAL_SERVER_IP = ("192.168.3.166",80) # LOCAL_SERVER_IP = ("192.168.3.167",22) +LOCAL_SERVER_IP = ("10.0.24.251",80) @@ -45,6 +46,11 @@ def close(ip,port): item[0].close() break +# 关闭所有 +def close_all(): + for item in _local_client: + item[0].close() + print('remote close all') @@ -115,13 +121,16 @@ def remote_client_handler(tcp_client_1:socket): close(j['ip'],j['port']) elif(j['option']=='data'): send_to(j['ip'],j['port'],data) + elif(j['device']=='proxy'): + if(j['option']=='close'): + close_all() except Exception as e: print(str(e)) recv_data=recv_data[end+1:] else: break tcp_client_1.close() - print("socket close.") + print("proxy close.")