51 lines
1.3 KiB
Python
51 lines
1.3 KiB
Python
import socket
|
|
import threading
|
|
|
|
|
|
LISTEN_HOST = "127.0.0.1"
|
|
LISTEN_PORT = 18007
|
|
TARGET_HOST = "192.168.41.184"
|
|
TARGET_PORT = 8007
|
|
|
|
|
|
def pipe(src: socket.socket, dst: socket.socket) -> None:
|
|
try:
|
|
while True:
|
|
data = src.recv(65536)
|
|
if not data:
|
|
break
|
|
dst.sendall(data)
|
|
except OSError:
|
|
pass
|
|
finally:
|
|
for sock in (src, dst):
|
|
try:
|
|
sock.shutdown(socket.SHUT_RDWR)
|
|
except OSError:
|
|
pass
|
|
try:
|
|
sock.close()
|
|
except OSError:
|
|
pass
|
|
|
|
|
|
def handle_client(client: socket.socket) -> None:
|
|
upstream = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
upstream.connect((TARGET_HOST, TARGET_PORT))
|
|
threading.Thread(target=pipe, args=(client, upstream), daemon=True).start()
|
|
threading.Thread(target=pipe, args=(upstream, client), daemon=True).start()
|
|
|
|
|
|
def main() -> None:
|
|
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
server.bind((LISTEN_HOST, LISTEN_PORT))
|
|
server.listen()
|
|
while True:
|
|
client, _ = server.accept()
|
|
threading.Thread(target=handle_client, args=(client,), daemon=True).start()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|