diff --git a/AUTHORS.txt b/AUTHORS.txt index 30b95db..751b533 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -46,6 +46,7 @@ Michael MacDonald Mikhail Bragin Miroslav Šedivý Nevio Vesic +Ondrej Sery Ori Bernstein Raja Subramanian Rasmus Hanning diff --git a/tcp_packet_conn.go b/tcp_packet_conn.go index 0b6d9d8..934ebd5 100644 --- a/tcp_packet_conn.go +++ b/tcp_packet_conn.go @@ -161,8 +161,11 @@ func (t *tcpPacketConn) startReading(conn net.Conn) { n, err := readStreamingPacket(conn, buf) if err != nil { t.params.Logger.Warnf("Failed to read streaming packet: %s", err) - t.handleRecv(streamingPacket{nil, conn.RemoteAddr(), err}) - t.removeConn(conn) + last := t.removeConn(conn) + // Only propagate connection closure errors if no other open connection exists. + if last || !(errors.Is(err, io.EOF) || errors.Is(err, net.ErrClosed)) { + t.handleRecv(streamingPacket{nil, conn.RemoteAddr(), err}) + } return } @@ -245,13 +248,14 @@ func (t *tcpPacketConn) closeAndLogError(closer io.Closer) { } } -func (t *tcpPacketConn) removeConn(conn net.Conn) { +func (t *tcpPacketConn) removeConn(conn net.Conn) bool { t.mu.Lock() defer t.mu.Unlock() t.closeAndLogError(conn) delete(t.conns, conn.RemoteAddr().String()) + return len(t.conns) == 0 } func (t *tcpPacketConn) Close() error {