问: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。你可以根据需要修改本地端口和目标地址。请注意,这只是一个简单的示例,实际的端口转发可能需要更多的配置和安全性措施。