package tunnel import ( "io" "net" ) func pipe(client net.Conn, server net.Conn) (err error) { stop := make(chan bool) go func() { err = relay(client, server, stop) }() go func() { err = relay(server, client, stop) }() select { case <-stop: return err } } func relay(src io.ReadCloser, dst io.WriteCloser, stop chan bool) (err error) { _, err = io.Copy(dst, src) dst.Close() src.Close() stop <- true return }