package main import ( "fmt" "log" "net" "os" "strconv" ) func main() { //源端口 argument1 := os.Args[1] log.Println( "需要变更的源端口为: %d",argument1) //目的端口 argument2 := os.Args[2] log.Println( "变更后的目的端口为: %d",argument2) // 判断系统32位还是64位 bit := 32 << (^uint(0) >> 63) fromport, err := strconv.ParseInt(argument1, 10, bit) if err != nil { log.Println("get pid failed [%s]", err.Error()) os.Exit(1) } toport, err := strconv.ParseInt(argument2, 10, bit) if err != nil { log.Println("get pid failed [%s]", err.Error()) os.Exit(1) } fromaddr := fmt.Sprintf(":%d", fromport) toaddr := fmt.Sprintf("127.0.0.1:%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 } } }