go 端口转发 代理 --chatGPT

问:changePort(A,B) 实现 将A端口转发到B
gpt:

要实现端口转发,可以使用 Go 语言的 `net` 包来创建一个简单的端口转发程序。以下是一个示例:

```go
package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    if len(os.Args) != 3 {
        fmt.Println("用法: ./portforward <本地端口> <目标地址:目标端口>")
        return
    }

    localPort := os.Args[1]
    remoteAddr := os.Args[2]

    // 创建本地监听
    localListener, err := net.Listen("tcp", "localhost:"+localPort)
    if err != nil {
        fmt.Println("无法监听端口:", err)
        return
    }
    defer localListener.Close()

    fmt.Printf("开始将本地端口 %s 转发到 %s\n", localPort, remoteAddr)

    for {
        // 等待本地连接
        localConn, err := localListener.Accept()
        if err != nil {
            fmt.Println("本地连接错误:", err)
            continue
        }

        // 启动 goroutine 处理转发
        go forward(localConn, remoteAddr)
    }
}

func forward(localConn net.Conn, remoteAddr string) {
    // 连接远程服务器
    remoteConn, err := net.Dial("tcp", remoteAddr)
    if err != nil {
        fmt.Println("无法连接到远程服务器:", err)
        localConn.Close()
        return
    }
    defer remoteConn.Close()

    // 启动 goroutine 处理从本地到远程的数据传输
    go func() {
        _, err := io.Copy(remoteConn, localConn)
        if err != nil {
            fmt.Println("本地到远程传输错误:", err)
        }
    }()

    // 处理从远程到本地的数据传输
    _, err = io.Copy(localConn, remoteConn)
    if err != nil {
        fmt.Println("远程到本地传输错误:", err)
    }
}
```

这个程序通过命令行参数接收本地端口和目标地址(包括目标主机和端口),然后创建一个本地监听器以接收传入的连接。每当有连接到达时,它将启动一个 goroutine 来处理数据传输,将本地端口的数据转发到目标地址上的端口,同时处理从远程到本地的数据传输。

你可以在命令行中运行这个程序,如下所示:

```shell
./portforward 8080 target.com:80
```

这将会将本地端口 8080 转发到目标主机 `target.com` 的端口 80。你可以根据需要修改本地端口和目标地址。请注意,这只是一个简单的示例,实际的端口转发可能需要更多的配置和安全性措施。

你可能感兴趣的:(golang,开发语言,后端)