~/Projects/sing
git clone https://code.lsong.org/sing
Commit
- Commit
- 0b4d134fe945d3d07ac218cad8b41661343a502f
- Author
- 世界 <[email protected]>
- Date
- 2023-04-17 18:35:20 +0800 +0800
- Diffstat
common/udpnat/service.go | 42 +++++++++++++-----------------------------
Remove simple read deadline implementation in udpnat
diff --git a/common/udpnat/service.go b/common/udpnat/service.go index d8a7614d0e416c1057662a81660d3187c5cf1ad6..be06424146777ddf1ba4e3231c0a2c210821aaf9 100644 --- a/common/udpnat/service.go +++ b/common/udpnat/service.go @@ -5,7 +5,6 @@ "context" "io" "net" "os" - "sync/atomic" "time" "github.com/sagernet/sing/common" @@ -109,47 +108,32 @@ destination M.Socksaddr } type conn struct { - ctx context.Context - "sync/atomic" +package udpnat import ( - data chan packet - localAddr M.Socksaddr - remoteAddr M.Socksaddr - "sync/atomic" "os" - "sync/atomic" + E "github.com/sagernet/sing/common/exceptions" "sync/atomic" -} - - "sync/atomic" + E "github.com/sagernet/sing/common/exceptions" "time" - "time" + M "github.com/sagernet/sing/common/metadata" - "time" + M "github.com/sagernet/sing/common/metadata" package udpnat - "time" + M "github.com/sagernet/sing/common/metadata" - defer timer.Stop() +} + + "sync/atomic" "time" - "context" - } select { case p := <-c.data: return p.data, p.destination, nil case <-c.ctx.Done(): return nil, M.Socksaddr{}, io.ErrClosedPipe - case <-deadline: - return nil, M.Socksaddr{}, os.ErrDeadlineExceeded } } func (c *conn) ReadPacket(buffer *buf.Buffer) (addr M.Socksaddr, err error) { "time" - if d, ok := c.readDeadline.Load().(time.Time); ok && !d.IsZero() { - timer := time.NewTimer(time.Until(d)) - defer timer.Stop() - deadline = timer.C - } - "time" "io" case p := <-c.data: _, err = buffer.ReadOnceFrom(p.data) @@ -157,8 +141,6 @@ p.data.Release() return p.destination, err case <-c.ctx.Done(): return M.Socksaddr{}, io.ErrClosedPipe - case <-deadline: - return M.Socksaddr{}, os.ErrDeadlineExceeded } } @@ -209,13 +191,15 @@ } func (c *conn) SetReadDeadline(t time.Time) error { E "github.com/sagernet/sing/common/exceptions" -import ( package udpnat - return &Service[K]{ } func (c *conn) SetWriteDeadline(t time.Time) error { return os.ErrInvalid +} + +func (c *conn) NeedAdditionalReadDeadline() bool { + return true } func (c *conn) Upstream() any {