From 6c76312e5c6e836da256cbaf3da6a7297beaff83 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Sun, 9 Apr 2023 22:58:05 +0800 Subject: [PATCH] chore: Add read deadline implementation --- adapter/outbound/base.go | 4 ++-- common/net/sing.go | 15 +++++++++++++++ go.mod | 2 +- go.sum | 4 ++-- listener/shadowsocks/tcp.go | 3 ++- listener/shadowsocks/udp.go | 3 ++- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index 156bc114..f356ae2d 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -199,7 +199,7 @@ func (c *conn) Upstream() any { } func NewConn(c net.Conn, a C.ProxyAdapter) C.Conn { - return &conn{N.NewExtendedConn(c), []string{a.Name()}, parseRemoteDestination(a.Addr())} + return &conn{N.NewDeadlineConn(c), []string{a.Name()}, parseRemoteDestination(a.Addr())} } type packetConn struct { @@ -230,7 +230,7 @@ func (c *packetConn) LocalAddr() net.Addr { } func newPacketConn(pc net.PacketConn, a C.ProxyAdapter) C.PacketConn { - return &packetConn{pc, []string{a.Name()}, a.Name(), utils.NewUUIDV4().String(), parseRemoteDestination(a.Addr())} + return &packetConn{N.NewDeadlinePacketConn(pc), []string{a.Name()}, a.Name(), utils.NewUUIDV4().String(), parseRemoteDestination(a.Addr())} } func parseRemoteDestination(addr string) string { diff --git a/common/net/sing.go b/common/net/sing.go index 5c980738..4aad5523 100644 --- a/common/net/sing.go +++ b/common/net/sing.go @@ -6,6 +6,7 @@ import ( "github.com/sagernet/sing/common" "github.com/sagernet/sing/common/bufio" + "github.com/sagernet/sing/common/bufio/deadline" "github.com/sagernet/sing/common/network" ) @@ -17,6 +18,20 @@ type ExtendedConn = network.ExtendedConn type ExtendedWriter = network.ExtendedWriter type ExtendedReader = network.ExtendedReader +func NewDeadlineConn(conn net.Conn) ExtendedConn { + if dc, ok := conn.(*deadline.Conn); ok { + return dc + } + return deadline.NewConn(conn) +} + +func NewDeadlinePacketConn(pc net.PacketConn) net.PacketConn { + if dpc, ok := pc.(*deadline.PacketConn); ok { + return dpc + } + return deadline.NewPacketConn(bufio.NewPacketConn(pc)) +} + func NeedHandshake(conn any) bool { if earlyConn, isEarlyConn := common.Cast[network.EarlyConn](conn); isEarlyConn && earlyConn.NeedHandshake() { return true diff --git a/go.mod b/go.mod index 275e9595..e7ceadf9 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/openacid/low v0.1.21 github.com/oschwald/geoip2-golang v1.8.0 github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 - github.com/sagernet/sing v0.2.2 + github.com/sagernet/sing v0.2.3-0.20230409094616-7f8eaee1b6c8 github.com/sagernet/sing-shadowtls v0.1.1-0.20230408141548-81d74d2a8661 github.com/sagernet/sing-vmess v0.1.4-0.20230409073451-6921c3dd77c7 github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9 diff --git a/go.sum b/go.sum index 05dc5abe..38a2e16c 100644 --- a/go.sum +++ b/go.sum @@ -144,8 +144,8 @@ github.com/sagernet/go-tun2socks v1.16.12-0.20220818015926-16cb67876a61/go.mod h github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97 h1:iL5gZI3uFp0X6EslacyapiRz7LLSJyr4RajF/BhMVyE= github.com/sagernet/netlink v0.0.0-20220905062125-8043b4a9aa97/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/sagernet/sing v0.0.0-20220817130738-ce854cda8522/go.mod h1:QVsS5L/ZA2Q5UhQwLrn0Trw+msNd/NPGEhBKR/ioWiY= -github.com/sagernet/sing v0.2.2 h1:qfEdSLuwFgIIkeLOcwVQkVDzKLHtclXb93Ql0zZA+aE= -github.com/sagernet/sing v0.2.2/go.mod h1:Ta8nHnDLAwqySzKhGoKk4ZIB+vJ3GTKj7UPrWYvM+4w= +github.com/sagernet/sing v0.2.3-0.20230409094616-7f8eaee1b6c8 h1:BWQjek8tNzDzCeHh/8yvjfZ8Id0tl+6pJ+gcPI8tjl8= +github.com/sagernet/sing v0.2.3-0.20230409094616-7f8eaee1b6c8/go.mod h1:Ta8nHnDLAwqySzKhGoKk4ZIB+vJ3GTKj7UPrWYvM+4w= github.com/sagernet/sing-shadowtls v0.1.1-0.20230408141548-81d74d2a8661 h1:QnV79JbJbJGT0MJJfd8o7QMEfRu3eUVKsmahxFMonrc= github.com/sagernet/sing-shadowtls v0.1.1-0.20230408141548-81d74d2a8661/go.mod h1:xCeSRP8cV32aPsY+6BbRdJjyD6q8ufdKwhgqxEbU/3U= github.com/sagernet/sing-vmess v0.1.4-0.20230409073451-6921c3dd77c7 h1:ZArINfN+zcHMdZCeRFOm4rO3SWyvYuLg3VhWcA5zonc= diff --git a/listener/shadowsocks/tcp.go b/listener/shadowsocks/tcp.go index c0fd490f..4e25a7b9 100644 --- a/listener/shadowsocks/tcp.go +++ b/listener/shadowsocks/tcp.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/Dreamacro/clash/adapter/inbound" + N "github.com/Dreamacro/clash/common/net" C "github.com/Dreamacro/clash/constant" LC "github.com/Dreamacro/clash/listener/config" "github.com/Dreamacro/clash/transport/shadowsocks/core" @@ -99,7 +100,7 @@ func (l *Listener) AddrList() (addrList []net.Addr) { } func (l *Listener) HandleConn(conn net.Conn, in chan<- C.ConnContext, additions ...inbound.Addition) { - conn = l.pickCipher.StreamConn(conn) + conn = N.NewDeadlineConn(l.pickCipher.StreamConn(conn)) target, err := socks5.ReadAddr(conn, make([]byte, socks5.MaxAddrLen)) if err != nil { diff --git a/listener/shadowsocks/udp.go b/listener/shadowsocks/udp.go index 3f058406..d884c2b8 100644 --- a/listener/shadowsocks/udp.go +++ b/listener/shadowsocks/udp.go @@ -4,6 +4,7 @@ import ( "net" "github.com/Dreamacro/clash/adapter/inbound" + N "github.com/Dreamacro/clash/common/net" "github.com/Dreamacro/clash/common/pool" "github.com/Dreamacro/clash/common/sockopt" C "github.com/Dreamacro/clash/constant" @@ -29,7 +30,7 @@ func NewUDP(addr string, pickCipher core.Cipher, in chan<- C.PacketAdapter) (*UD } sl := &UDPListener{l, false} - conn := pickCipher.PacketConn(l) + conn := N.NewDeadlinePacketConn(pickCipher.PacketConn(l)) go func() { for { buf := pool.Get(pool.RelayBufferSize)