其中一方断线后,通知另一方断开连接

This commit is contained in:
ranchuan
2024-05-23 11:14:17 +08:00
parent 01a7700619
commit b36e74f798
5 changed files with 58 additions and 8 deletions

View File

@@ -5,3 +5,7 @@
2024.5.22 2024.5.22
实现端口转发功能经测试ssh、http可以正常使用 实现端口转发功能经测试ssh、http可以正常使用
2024.5.23
其中一方断线后,通知另一方断开连接

View File

@@ -40,6 +40,7 @@ def dispose_client_request(tcp_client_1,tcp_addr):
break break
print(f"客户端:{tcp_addr} 已下线") print(f"客户端:{tcp_addr} 已下线")
tcp_client_1.close() tcp_client_1.close()
target.close()

View File

@@ -14,12 +14,14 @@ import prot_codec as pc
# device: # device:
# server # server
# client # client
# proxy
# 定义操作类型 # 定义操作类型
# option: # option:
# connect # connect
# disconnect # disconnect
# data # data
# login # login
# close
_tcp_server=None _tcp_server=None
@@ -53,5 +55,21 @@ class tcp_target(object):
else: else:
if(_tcp_client is not None): if(_tcp_client is not None):
_tcp_client.send(recv_data) _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))

View File

@@ -23,7 +23,7 @@ _LOCAL_PORT = 31234
_remote_client=None _remote_client=None
_local_client=[] _local_client=[]
_local_server=None
# 发送数据到指定ip地址和端口 # 发送数据到指定ip地址和端口
@@ -40,9 +40,15 @@ def send_to(ip,port,data:bytearray):
def close(ip,port): def close(ip,port):
for item in _local_client: for item in _local_client:
if(item[1]==ip and item[2]==port): if(item[1]==ip and item[2]==port):
print(f'remote close {ip},{port}')
item[0].close() item[0].close()
break 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): def remote_client_handler(tcp_remote:socket):
global _remote_client global _remote_client
global _local_client global _local_client
global _local_server
print("已连接代理服务器") print("已连接代理服务器")
recv_data=bytearray() recv_data=bytearray()
cmd={'device':'client','option':'login'} cmd={'device':'client','option':'login'}
@@ -78,12 +85,18 @@ def remote_client_handler(tcp_remote:socket):
send_to(j['ip'],j['port'],data) send_to(j['ip'],j['port'],data)
elif(j['option']=='disconnect'): elif(j['option']=='disconnect'):
close(j['ip'],j['port']) close(j['ip'],j['port'])
elif(j['device']=='proxy'):
if(j['option']=='close'):
close_all()
except Exception as e: except Exception as e:
print(str(e)) print(str(e))
recv_data=recv_data[end+1:] recv_data=recv_data[end+1:]
else: else:
break break
tcp_remote.close() 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(): def main():
global _remote_client global _remote_client
global _local_client global _local_client
global _local_server
_remote_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) _remote_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
_remote_client.connect(("1.92.113.30",5345)) _remote_client.connect(("1.92.113.30",5345))
thd = threading.Thread(target = remote_client_handler, args = (_remote_client,)) thd = threading.Thread(target = remote_client_handler, args = (_remote_client,))
thd.start() thd.start()
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) _local_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) _local_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
tcp_server.bind(("",_LOCAL_PORT)) _local_server.bind(("",_LOCAL_PORT))
print(f"开始监听({_LOCAL_PORT})") print(f"开始监听({_LOCAL_PORT})")
tcp_server.listen(128) _local_server.listen(128)
while True: 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 = threading.Thread(target = local_client_handler, args = (temp,temp_address))
thd.start() thd.start()

View File

@@ -24,8 +24,9 @@ _remote_client=None
_local_client=[] _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 = ("192.168.3.167",22)
LOCAL_SERVER_IP = ("10.0.24.251",80)
@@ -45,6 +46,11 @@ def close(ip,port):
item[0].close() item[0].close()
break 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']) close(j['ip'],j['port'])
elif(j['option']=='data'): elif(j['option']=='data'):
send_to(j['ip'],j['port'],data) send_to(j['ip'],j['port'],data)
elif(j['device']=='proxy'):
if(j['option']=='close'):
close_all()
except Exception as e: except Exception as e:
print(str(e)) print(str(e))
recv_data=recv_data[end+1:] recv_data=recv_data[end+1:]
else: else:
break break
tcp_client_1.close() tcp_client_1.close()
print("socket close.") print("proxy close.")