共计 1084 个字符,预计需要花费 3 分钟才能阅读完成。
作为一个中间的 tcp 代理转发,来不及解释了,快上车!上 Code!
package main
import (
"fmt"
"log"
"net"
//"os"
)
func main() {
// 这里可以传入参数
//if len(os.Args) != 5 {// log.Fatalf("Usage: %s <source ip> <source port> <destination ip> <destination port>", os.Args[0])
//}
// 源端口,目的端口
var fromport, toport int = 8888,43822
fromaddr := fmt.Sprintf("0.0.0.0:%d", fromport)
toaddr := fmt.Sprintf("192.168.3.88:%d", toport)
fromlistener, err := net.Listen("tcp", fromaddr)
if err != nil {log.Fatal("Unable to listen on: %s, error: %s\n", fromaddr, err.Error())
}
defer fromlistener.Close()
for {fromcon, err := fromlistener.Accept()
if err != nil {fmt.Printf("Unable to accept a request, error: %s\n", err.Error())
} else {fmt.Println("new connect:" + fromcon.RemoteAddr().String())
}
// 这边最好也做个协程,防止阻塞
toCon, err := net.Dial("tcp", toaddr)
if err != nil {fmt.Printf("can not connect to %s\n", toaddr)
continue
}
go handleConnection(fromcon, toCon)
go handleConnection(toCon, fromcon)
}
}
func handleConnection(r, w net.Conn) {defer r.Close()
defer w.Close()
var buffer = make([]byte, 100000)
for {n, err := r.Read(buffer)
if err != nil {break}
n, err = w.Write(buffer[:n])
if err != nil {break}
}
}
新开一个 cmd 窗口,使用 telnet 探测一下 8888 端口:
说明代理转发成功,代码短小精悍。
正文完
扫码赞助
