// Dial connects to a remote address and pipes all os.Stdin to the remote end. // If localAddr is set, uses it to Dial from. func Dial(localAddr, remoteAddr string) error { var laddr net.Addr var err error if localAddr != "" { laddr, err = utp.ResolveAddr("utp", localAddr) if err != nil { return fmt.Errorf("failed to resolve address %s", localAddr) } } if laddr != nil { log("dialing %s from %s", remoteAddr, laddr) } else { log("dialing %s", remoteAddr) } d := utp.Dialer{LocalAddr: laddr} c, err := d.Dial("utp", remoteAddr) if err != nil { return err } log("connected to %s", c.RemoteAddr()) netcat(c) return c.Close() }
// Listen listens and accepts one incoming uTP connection on a given port, // and pipes all incoming data to os.Stdout. func Listen(localAddr string) error { laddr, err := utp.ResolveAddr("utp", localAddr) if err != nil { return fmt.Errorf("failed to resolve address %s", localAddr) } l, err := utp.Listen("utp", laddr) if err != nil { return err } log("listening at %s", l.Addr()) c, err := l.Accept() if err != nil { return err } log("accepted connection from %s", c.RemoteAddr()) // should be able to close listener here, but utp.Listener.Close // closes all open connections. defer l.Close() netcat(c) return c.Close() }