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  }