diff --git a/dnstt-client/main.go b/dnstt-client/main.go index 9754cae..87dc302 100644 --- a/dnstt-client/main.go +++ b/dnstt-client/main.go @@ -110,16 +110,21 @@ func handle(local *net.TCPConn, sess *smux.Session, conv uint32) error { if err != nil { log.Printf("stream %08x:%d copy stream←local: %v\n", conv, stream.ID(), err) } + local.CloseRead() stream.Close() }() wg.Add(1) go func() { defer wg.Done() _, err := io.Copy(local, stream) - if err != nil { + if err == io.EOF { + // smux Stream.WriteTo may return io.EOF. + err = nil + } + if err != nil && err != io.ErrClosedPipe { log.Printf("stream %08x:%d copy local←stream: %v\n", conv, stream.ID(), err) } - local.Close() + local.CloseWrite() }() wg.Wait() diff --git a/dnstt-server/main.go b/dnstt-server/main.go index 0cf1e38..bd7a4fe 100644 --- a/dnstt-server/main.go +++ b/dnstt-server/main.go @@ -83,16 +83,21 @@ func handleStream(stream *smux.Stream, upstream *net.TCPAddr, conv uint32) error if err != nil { log.Printf("stream %08x:%d copy stream←upstream: %v\n", conv, stream.ID(), err) } + conn.CloseRead() stream.Close() }() wg.Add(1) go func() { defer wg.Done() _, err := io.Copy(conn, stream) - if err != nil { + if err == io.EOF { + // smux Stream.WriteTo may return io.EOF. + err = nil + } + if err != nil && err != io.ErrClosedPipe { log.Printf("stream %08x:%d copy upstream←stream: %v\n", conv, stream.ID(), err) } - conn.Close() + conn.CloseWrite() }() wg.Wait()