其中一方断线后,通知另一方断开连接
This commit is contained in:
@@ -5,3 +5,7 @@
|
|||||||
2024.5.22
|
2024.5.22
|
||||||
实现端口转发功能,经测试,ssh、http可以正常使用
|
实现端口转发功能,经测试,ssh、http可以正常使用
|
||||||
|
|
||||||
|
2024.5.23
|
||||||
|
其中一方断线后,通知另一方断开连接
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
18
target.py
18
target.py
@@ -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))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
|
|
||||||
|
@@ -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.")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user