diff --git a/Dockerfile b/Dockerfile index 7560316..1131db2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM golang:1-alpine as builder -RUN apk add --no-cache musl-dev git gcc +RUN apk add --no-cache musl-dev gcc ADD . /src diff --git a/dns.go b/dns.go index 1b02404..278e57b 100644 --- a/dns.go +++ b/dns.go @@ -14,6 +14,7 @@ import ( "strings" "time" + "github.com/go-gost/bpool" "github.com/go-log/log" "github.com/miekg/dns" ) @@ -59,8 +60,8 @@ func (h *dnsHandler) Init(opts ...HandlerOption) { func (h *dnsHandler) Handle(conn net.Conn) { defer conn.Close() - b := mPool.Get().([]byte) - defer mPool.Put(b) + b := bpool.Get(mediumBufferSize) + defer bpool.Put(b) n, err := conn.Read(b) if err != nil { diff --git a/go.mod b/go.mod index 266940e..0e398cb 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/ginuerzh/gosocks4 v0.0.1 github.com/ginuerzh/gosocks5 v0.2.0 github.com/ginuerzh/tls-dissector v0.0.2-0.20200224064855-24ab2b3a3796 + github.com/go-gost/bpool v1.0.0 github.com/go-gost/relay v0.1.0 github.com/go-log/log v0.1.0 github.com/gobwas/glob v0.2.3 diff --git a/go.sum b/go.sum index 4910a36..6d9d19c 100644 --- a/go.sum +++ b/go.sum @@ -28,6 +28,8 @@ github.com/ginuerzh/gosocks5 v0.2.0 h1:K0Ua23U9LU3BZrf3XpGDcs0mP8DiEpa6PJE4TA/MU github.com/ginuerzh/gosocks5 v0.2.0/go.mod h1:qp22mr6tH/prEoaN0pFukq76LlScIE+F2rP2ZP5ZHno= github.com/ginuerzh/tls-dissector v0.0.2-0.20200224064855-24ab2b3a3796 h1:VPXbYRvZUzTemsI7u0FzOnEuHeHwQuMTPXApAu8aeX4= github.com/ginuerzh/tls-dissector v0.0.2-0.20200224064855-24ab2b3a3796/go.mod h1:YyzP8PQrGwDH/XsfHJXwqdHLwWvBYxu77YVKm0+68f0= +github.com/go-gost/bpool v1.0.0 h1:Og+6SH6SooHqf8CIwuxcPRHq8k0Si4YEfO2mBEi3/Uk= +github.com/go-gost/bpool v1.0.0/go.mod h1:y/Pywm22A4OrJqNF/mL4nW7yb9fCdhlO8cxjyparkFI= github.com/go-gost/relay v0.1.0 h1:UOf2YwAzzaUjY5mdpMuLfSw0vz62iIFYk7oJQkuhlGw= github.com/go-gost/relay v0.1.0/go.mod h1:YFCpddLOFE3NlIkeDWRdEs8gL/GFsqXdtaf8SV5v4YQ= github.com/go-log/log v0.1.0 h1:wudGTNsiGzrD5ZjgIkVZ517ugi2XRe9Q/xRCzwEO4/U= @@ -48,6 +50,8 @@ github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/reedsolomon v1.7.0 h1:pLFmRKGko2ZieiTGyo9DahLCIuljyxm+Zzhz/fYEonE= github.com/klauspost/reedsolomon v1.7.0/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= +github.com/libp2p/go-buffer-pool v0.0.3-0.20191206215133-4016316b51a2 h1:pSnSOZz0cmK3c6944tZdBq7Je9Qf28w80n+PCaq+2Qk= +github.com/libp2p/go-buffer-pool v0.0.3-0.20191206215133-4016316b51a2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f h1:sSeNEkJrs+0F9TUau0CgWTTNEwF23HST3Eq0A+QIx+A= github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH9J1c9oX6otFSgdUHwUBUizmKlrMjxWnIAjff4m04= github.com/lucas-clemente/quic-go v0.10.0 h1:xEF+pSHYAOcu+U10Meunf+DTtc8vhQDRqlA0BJ6hufc= diff --git a/gost.go b/gost.go index 02dd7f4..0ec2579 100644 --- a/gost.go +++ b/gost.go @@ -13,7 +13,6 @@ import ( "net" "net/http" "strings" - "sync" "time" "github.com/go-log/log" @@ -32,24 +31,6 @@ var ( largeBufferSize = 32 * 1024 // 32KB large buffer ) -var ( - sPool = sync.Pool{ - New: func() interface{} { - return make([]byte, smallBufferSize) - }, - } - mPool = sync.Pool{ - New: func() interface{} { - return make([]byte, mediumBufferSize) - }, - } - lPool = sync.Pool{ - New: func() interface{} { - return make([]byte, largeBufferSize) - }, - } -) - var ( // KeepAliveTime is the keep alive time period for TCP connection. KeepAliveTime = 180 * time.Second diff --git a/relay.go b/relay.go index be25c9c..640bfd6 100644 --- a/relay.go +++ b/relay.go @@ -13,6 +13,7 @@ import ( "sync" "time" + "github.com/go-gost/bpool" "github.com/go-gost/relay" "github.com/go-log/log" ) @@ -338,8 +339,8 @@ func (c *relayConn) Write(b []byte) (n int, err error) { nsize := 2 + len(b) var buf []byte if nsize <= mediumBufferSize { - buf = mPool.Get().([]byte) - defer mPool.Put(buf) + buf = bpool.Get(mediumBufferSize) + defer bpool.Put(buf) } else { buf = make([]byte, nsize) } diff --git a/server.go b/server.go index dd8d556..6e4e8a5 100644 --- a/server.go +++ b/server.go @@ -5,6 +5,7 @@ import ( "net" "time" + "github.com/go-gost/bpool" "github.com/go-log/log" ) @@ -120,8 +121,8 @@ func transport(rw1, rw2 io.ReadWriter) error { } func copyBuffer(dst io.Writer, src io.Reader) error { - buf := lPool.Get().([]byte) - defer lPool.Put(buf) + buf := bpool.Get(largeBufferSize) + defer bpool.Put(buf) _, err := io.CopyBuffer(dst, src, buf) return err diff --git a/socks.go b/socks.go index 39a7a9e..d1f7436 100644 --- a/socks.go +++ b/socks.go @@ -15,6 +15,7 @@ import ( "github.com/ginuerzh/gosocks4" "github.com/ginuerzh/gosocks5" + "github.com/go-gost/bpool" "github.com/go-log/log" smux "gopkg.in/xtaci/smux.v1" ) @@ -1238,8 +1239,8 @@ func (h *socks5Handler) transportUDP(relay, peer net.PacketConn) (err error) { var clientAddr net.Addr go func() { - b := mPool.Get().([]byte) - defer mPool.Put(b) + b := bpool.Get(mediumBufferSize) + defer bpool.Put(b) for { n, laddr, err := relay.ReadFrom(b) @@ -1275,8 +1276,8 @@ func (h *socks5Handler) transportUDP(relay, peer net.PacketConn) (err error) { }() go func() { - b := mPool.Get().([]byte) - defer mPool.Put(b) + b := bpool.Get(mediumBufferSize) + defer bpool.Put(b) for { n, raddr, err := peer.ReadFrom(b) @@ -1318,8 +1319,8 @@ func (h *socks5Handler) tunnelClientUDP(uc *net.UDPConn, cc net.Conn) (err error var clientAddr *net.UDPAddr go func() { - b := mPool.Get().([]byte) - defer mPool.Put(b) + b := bpool.Get(mediumBufferSize) + defer bpool.Put(b) for { n, addr, err := uc.ReadFromUDP(b) @@ -1458,8 +1459,8 @@ func (h *socks5Handler) tunnelServerUDP(cc net.Conn, pc net.PacketConn) (err err errc := make(chan error, 2) go func() { - b := mPool.Get().([]byte) - defer mPool.Put(b) + b := bpool.Get(mediumBufferSize) + defer bpool.Put(b) for { n, addr, err := pc.ReadFrom(b) @@ -2033,8 +2034,8 @@ func (c *socks5UDPConn) Read(b []byte) (n int, err error) { } func (c *socks5UDPConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { - data := mPool.Get().([]byte) - defer mPool.Put(data) + data := bpool.Get(mediumBufferSize) + defer bpool.Put(data) n, err = c.UDPConn.Read(data) if err != nil { diff --git a/ss.go b/ss.go index e3532fd..5f37f2a 100644 --- a/ss.go +++ b/ss.go @@ -11,6 +11,7 @@ import ( "time" "github.com/ginuerzh/gosocks5" + "github.com/go-gost/bpool" "github.com/go-log/log" "github.com/shadowsocks/go-shadowsocks2/core" ss "github.com/shadowsocks/shadowsocks-go/shadowsocks" @@ -61,8 +62,8 @@ func (c *shadowConnector) ConnectContext(ctx context.Context, conn net.Conn, net if err != nil { return nil, err } - rawaddr := sPool.Get().([]byte) - defer sPool.Put(rawaddr) + rawaddr := bpool.Get(smallBufferSize) + defer bpool.Put(rawaddr) n, err := socksAddr.Encode(rawaddr) if err != nil { @@ -340,8 +341,8 @@ func (h *shadowUDPHandler) transportPacket(conn, cc net.PacketConn) (err error) go func() { for { err := func() error { - b := mPool.Get().([]byte) - defer mPool.Put(b) + b := bpool.Get(mediumBufferSize) + defer bpool.Put(b) n, addr, err := conn.ReadFrom(b) if err != nil { @@ -377,8 +378,8 @@ func (h *shadowUDPHandler) transportPacket(conn, cc net.PacketConn) (err error) go func() { for { err := func() error { - b := mPool.Get().([]byte) - defer mPool.Put(b) + b := bpool.Get(mediumBufferSize) + defer bpool.Put(b) n, addr, err := cc.ReadFrom(b) if err != nil { @@ -452,8 +453,8 @@ func (h *shadowUDPHandler) transportUDP(conn net.Conn, cc net.PacketConn) error go func() { for { er := func() (err error) { - b := mPool.Get().([]byte) - defer mPool.Put(b) + b := bpool.Get(mediumBufferSize) + defer bpool.Put(b) n, addr, err := cc.ReadFrom(b) if err != nil { @@ -514,8 +515,8 @@ type shadowUDPPacketConn struct { } func (c *shadowUDPPacketConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { - buf := mPool.Get().([]byte) - defer mPool.Put(buf) + buf := bpool.Get(mediumBufferSize) + defer bpool.Put(buf) buf[0] = 0 buf[1] = 0 @@ -553,8 +554,8 @@ func (c *shadowUDPPacketConn) WriteTo(b []byte, addr net.Addr) (n int, err error return } - buf := mPool.Get().([]byte) - defer mPool.Put(buf) + buf := bpool.Get(mediumBufferSize) + defer bpool.Put(buf) copy(buf, rawaddr[:nn]) n = copy(buf[nn:], b) @@ -611,8 +612,8 @@ func initShadowCipher(info *url.Userinfo) (cipher core.Cipher) { func readSocksAddr(r io.Reader) (*gosocks5.Addr, error) { addr := &gosocks5.Addr{} - b := sPool.Get().([]byte) - defer sPool.Put(b) + b := bpool.Get(smallBufferSize) + defer bpool.Put(b) _, err := io.ReadFull(r, b[:1]) if err != nil { diff --git a/tuntap.go b/tuntap.go index e38ab63..0ab506d 100644 --- a/tuntap.go +++ b/tuntap.go @@ -10,6 +10,7 @@ import ( "sync" "time" + "github.com/go-gost/bpool" "github.com/go-log/log" "github.com/shadowsocks/go-shadowsocks2/core" "github.com/shadowsocks/go-shadowsocks2/shadowaead" @@ -260,8 +261,8 @@ func (h *tunHandler) transportTun(tun net.Conn, conn net.PacketConn, raddr net.A go func() { for { err := func() error { - b := sPool.Get().([]byte) - defer sPool.Put(b) + b := bpool.Get(smallBufferSize) + defer bpool.Put(b) n, err := tun.Read(b) if err != nil { @@ -334,8 +335,8 @@ func (h *tunHandler) transportTun(tun net.Conn, conn net.PacketConn, raddr net.A go func() { for { err := func() error { - b := sPool.Get().([]byte) - defer sPool.Put(b) + b := bpool.Get(smallBufferSize) + defer bpool.Put(b) n, addr, err := conn.ReadFrom(b) if err != nil && @@ -636,8 +637,8 @@ func (h *tapHandler) transportTap(tap net.Conn, conn net.PacketConn, raddr net.A go func() { for { err := func() error { - b := sPool.Get().([]byte) - defer sPool.Put(b) + b := bpool.Get(smallBufferSize) + defer bpool.Put(b) n, err := tap.Read(b) if err != nil { @@ -696,8 +697,8 @@ func (h *tapHandler) transportTap(tap net.Conn, conn net.PacketConn, raddr net.A go func() { for { err := func() error { - b := sPool.Get().([]byte) - defer sPool.Put(b) + b := bpool.Get(smallBufferSize) + defer bpool.Put(b) n, addr, err := conn.ReadFrom(b) if err != nil && diff --git a/udp.go b/udp.go index c2a71ab..4669868 100644 --- a/udp.go +++ b/udp.go @@ -7,6 +7,7 @@ import ( "sync/atomic" "time" + "github.com/go-gost/bpool" "github.com/go-log/log" ) @@ -90,7 +91,7 @@ func UDPListener(addr string, cfg *UDPListenConfig) (Listener, error) { func (l *udpListener) listenLoop() { for { // NOTE: this buffer will be released in the udpServerConn after read. - b := mPool.Get().([]byte) + b := bpool.Get(mediumBufferSize) n, raddr, err := l.ln.ReadFrom(b) if err != nil { @@ -243,7 +244,7 @@ func (c *udpServerConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { case bb := <-c.rChan: n = copy(b, bb) if cap(bb) == mediumBufferSize { - mPool.Put(bb[:cap(bb)]) + bpool.Put(bb[:cap(bb)]) } case <-c.closed: err = errors.New("read from closed connection")