python实现socket端口重定向示例


在Python中,实现socket端口重定向通常涉及到监听一个端口,并将接收到的数据转发到另一个端口上。这里我们可以使用`socket`库来完成这个任务。以下是一个简单的端口重定向的示例代码:


import socket
import threading

def forward_data(source_socket, target_host, target_port):
    """
    将源socket接收到的数据转发到指定的目标主机和端口
    :param source_socket: 接收数据的socket
    :param target_host: 目标主机地址
    :param target_port: 目标端口号
    """
    # 创建一个新的socket连接到目标地址
    target_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    target_socket.connect((target_host, target_port))

    # 接收数据并转发
    try:
        while True:
            data = source_socket.recv(4096)
            if not data:
                break  # 如果没有数据,则断开连接
            target_socket.sendall(data)
    finally:
        target_socket.close()

def handle_client(client_socket, target_host, target_port):
    """
    处理客户端连接,创建线程转发数据
    :param client_socket: 客户端socket
    :param target_host: 目标主机地址
    :param target_port: 目标端口号
    """
    # 创建一个线程来转发数据
    threading.Thread(target=forward_data, args=(client_socket, target_host, target_port), daemon=True).start()

def main(listen_port, target_host, target_port):
    """
    主函数,启动socket监听并转发数据
    :param listen_port: 监听端口号
    :param target_host: 目标主机地址
    :param target_port: 目标端口号
    """
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', listen_port))
    server_socket.listen(5)
    print(f"Listening on port {listen_port}...")

    try:
        while True:
            client_socket, addr = server_socket.accept()
            print(f"Accepted connection from {addr}")
            handle_client(client_socket, target_host, target_port)
    finally:
        server_socket.close()

if __name__ == "__main__":
    # 设定监听端口、目标主机和目标端口
    LISTEN_PORT = 12345
    TARGET_HOST = '127.0.0.1'  # 例如,重定向到本地主机的某个端口
    TARGET_PORT = 8080
    main(LISTEN_PORT, TARGET_HOST, TARGET_PORT)

这段代码首先定义了一个`forward_data`函数,它负责将接收到的数据转发到指定的目标主机和端口。然后,`handle_client`函数使用线程来为每个客户端连接创建一个转发任务。最后,`main`函数设置了监听端口,并接受客户端连接,为每个连接调用`handle_client`函数。

请注意,这个示例代码假定目标主机和端口是可访问的,并且客户端将连接到这个脚本监听的端口。在实际应用中,你可能需要处理网络错误、超时、异常等情况,并可能需要添加日志记录等功能。