diff --git a/utils/net/conn.go b/utils/net/conn.go index 78319cc7..b1877331 100644 --- a/utils/net/conn.go +++ b/utils/net/conn.go @@ -21,6 +21,7 @@ import ( "io" "net" "sync" + "sync/atomic" "time" "github.com/fatedier/frp/utils/log" @@ -178,6 +179,7 @@ func (sc *SharedConn) WriteBuff(buffer []byte) (err error) { type StatsConn struct { Conn + closed int64 // 1 means closed totalRead int64 totalWrite int64 statsFunc func(totalRead, totalWrite int64) @@ -203,9 +205,12 @@ func (statsConn *StatsConn) Write(p []byte) (n int, err error) { } func (statsConn *StatsConn) Close() (err error) { - err = statsConn.Conn.Close() - if statsConn.statsFunc != nil { - statsConn.statsFunc(statsConn.totalRead, statsConn.totalWrite) + old := atomic.SwapInt64(&statsConn.closed, 1) + if old != 1 { + err = statsConn.Conn.Close() + if statsConn.statsFunc != nil { + statsConn.statsFunc(statsConn.totalRead, statsConn.totalWrite) + } } return }