func main() { defer envpprof.Stop() listen := flag.Bool("l", false, "listen") port := flag.Int("p", 0, "port to listen on") flag.Parse() var ( conn net.Conn err error ) if *listen { s, err := utp.NewSocket("udp", fmt.Sprintf(":%d", *port)) if err != nil { log.Fatal(err) } defer s.Close() conn, err = s.Accept() if err != nil { log.Fatal(err) } } else { conn, err = utp.Dial(net.JoinHostPort(flag.Arg(0), flag.Arg(1))) if err != nil { log.Fatal(err) } } defer conn.Close() go func() { sig := make(chan os.Signal, 1) signal.Notify(sig, os.Interrupt) <-sig conn.Close() }() writerDone := make(chan struct{}) readerDone := make(chan struct{}) go func() { defer close(writerDone) written, err := io.Copy(conn, os.Stdin) if err != nil { conn.Close() log.Fatalf("error after writing %d bytes: %s", written, err) } log.Printf("wrote %d bytes", written) conn.Close() }() go func() { defer close(readerDone) n, err := io.Copy(os.Stdout, conn) if err != nil { log.Fatal(err) } log.Printf("received %d bytes", n) }() // Technically we should wait until both reading and writing are done. But // ucat-style binaries terminate abrubtly when read or write is completed, // and no state remains to clean-up the peer neatly. select { case <-writerDone: case <-readerDone: } }
func main() { list := flag.Bool("l", false, "listen on the given address") spew := flag.Bool("spew", false, "spew random data on the connection") flag.Usage = func() { fmt.Fprintf(os.Stderr, "Usage: %s [-l] <host> <port>\n", os.Args[0]) } flag.Parse() c := make(chan os.Signal) signal.Notify(c, os.Interrupt) if len(flag.Args()) < 2 { flag.Usage() os.Exit(1) } addr := fmt.Sprintf("%s:%s", flag.Arg(0), flag.Arg(1)) var con io.ReadWriteCloser if *list { sock, err := utp.NewSocket("udp", addr) if err != nil { fmt.Fprintf(os.Stderr, "create socket failed: %s\n", err) os.Exit(1) } defer sock.Close() utpcon, err := sock.Accept() if err != nil { fmt.Fprintf(os.Stderr, "accept failed: %s\n", err) os.Exit(1) } con = utpcon } else { utpcon, err := utp.Dial(addr) if err != nil { fmt.Fprintf(os.Stderr, "dial failed: %s\n", err) os.Exit(1) } con = utpcon } var in io.Reader = os.Stdin if *spew { in = rand.New() } go func() { <-c con.Close() }() beNetcat(con, in) }
func main() { defer envpprof.Stop() listen := flag.Bool("l", false, "listen") port := flag.Int("p", 0, "port to listen on") flag.Parse() var ( conn net.Conn err error ) if *listen { s, err := utp.NewSocket("udp", fmt.Sprintf(":%d", *port)) if err != nil { log.Fatal(err) } defer s.Close() conn, err = s.Accept() if err != nil { log.Fatal(err) } } else { conn, err = utp.Dial(net.JoinHostPort(flag.Arg(0), flag.Arg(1))) if err != nil { log.Fatal(err) } } defer conn.Close() go func() { sig := make(chan os.Signal, 1) signal.Notify(sig, os.Interrupt) <-sig conn.Close() }() writerDone := make(chan struct{}) go func() { defer close(writerDone) written, err := io.Copy(conn, os.Stdin) if err != nil { conn.Close() log.Fatalf("error after writing %d bytes: %s", written, err) } log.Printf("wrote %d bytes", written) conn.Close() }() n, err := io.Copy(os.Stdout, conn) if err != nil { log.Fatal(err) } log.Printf("received %d bytes", n) // <-writerDone }