github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/tools/dump/dump.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "net" 7 "os" 8 "time" 9 ) 10 11 func main() { 12 var protocol, address, out, target, mode string 13 flag.StringVar(&protocol, "p", "tcp", "the listen protocol") 14 flag.StringVar(&address, "l", "", "the listen address") 15 flag.StringVar(&out, "o", "text", "the print out mode") 16 flag.StringVar(&target, "t", "", "the target remote address") 17 flag.StringVar(&mode, "m", "", "the runner mode") 18 flag.Parse() 19 if len(address) < 1 { 20 flag.PrintDefaults() 21 os.Exit(1) 22 return 23 } 24 if protocol == "udp" { 25 addr, err := net.ResolveUDPAddr("udp", address) 26 if err != nil { 27 fmt.Println("Can't resolve address: ", err) 28 os.Exit(1) 29 } 30 conn, err := net.ListenUDP("udp", addr) 31 if err != nil { 32 fmt.Println(err) 33 os.Exit(1) 34 return 35 } 36 buffer := make([]byte, 32*1024) 37 name := "ECHO " 38 for { 39 n, addr, err := conn.ReadFromUDP(buffer) 40 if err != nil { 41 break 42 } 43 switch out { 44 case "text": 45 fmt.Printf("%v(%v):\n%v\n\n", name, n, string(buffer[0:n])) 46 default: 47 fmt.Printf("%v(%v):\n%v\n\n", name, n, buffer[0:n]) 48 } 49 time.Sleep(time.Millisecond) 50 _, err = conn.WriteToUDP(buffer[0:n], addr) 51 if err != nil { 52 break 53 } 54 } 55 return 56 } 57 listener, err := net.Listen("tcp", address) 58 if err != nil { 59 fmt.Println(err) 60 os.Exit(1) 61 return 62 } 63 for { 64 conn, err := listener.Accept() 65 if err != nil { 66 break 67 } 68 if len(target) > 0 { 69 go forwardConn(conn, target, out) 70 } else { 71 go copyPrint("ECHO ", conn, conn, out) 72 } 73 } 74 } 75 76 func forwardConn(local net.Conn, target, out string) { 77 fmt.Printf("=================\n\nCONN start %v dial to %v\n\n", out, target) 78 remote, err := net.Dial("tcp", target) 79 if err != nil { 80 fmt.Printf("dial to remote %v fail with %v\n", target, err) 81 return 82 } 83 go copyPrint("RECV ", local, remote, out) 84 copyPrint("SEND ", remote, local, out) 85 fmt.Printf("CONN connection to %v is closed\n\n=================\n\n", target) 86 } 87 88 func copyPrint(name string, dst, src net.Conn, out string) { 89 buffer := make([]byte, 32*1024) 90 for { 91 n, err := src.Read(buffer) 92 if err != nil { 93 break 94 } 95 switch out { 96 case "text": 97 fmt.Printf("%v(%v):\n%v\n\n", name, n, string(buffer[0:n])) 98 default: 99 fmt.Printf("%v(%v):\n%v\n\n", name, n, buffer[0:n]) 100 } 101 _, err = dst.Write(buffer[0:n]) 102 if err != nil { 103 break 104 } 105 } 106 dst.Close() 107 }