From 50d7e373ce02c3a28060421300ca697b80080849 Mon Sep 17 00:00:00 2001 From: e1732a364fed <75717694+e1732a364fed@users.noreply.github.com> Date: Sat, 1 Jan 2000 00:00:00 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E8=AE=A2=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proxy/trojan/client.go | 10 ++++++++-- proxy/trojan/server.go | 10 ++++++++-- proxy/trojan/tcpconn.go | 6 ++++-- proxy/vless/client.go | 3 +++ proxy/vless/server.go | 3 +++ proxy/vless/tcpconn.go | 5 +++-- tlsLayer/fake.go | 2 ++ utils/buffers.go | 9 +++++---- 8 files changed, 36 insertions(+), 12 deletions(-) diff --git a/proxy/trojan/client.go b/proxy/trojan/client.go index f7b1836..fb9db09 100644 --- a/proxy/trojan/client.go +++ b/proxy/trojan/client.go @@ -129,11 +129,17 @@ func (c *Client) Handshake(underlay net.Conn, firstPayload []byte, target netLay return underlay, nil } else { // 发现直接返回 underlay 反倒无法利用readv, 所以还是统一用包装过的. 目前利用readv是可以加速的. - return &UserTCPConn{ + uc := &UserTCPConn{ Conn: underlay, User: c.User, underlayIsBasic: netLayer.IsBasicConn(underlay), - }, nil + } + + if mw, ok := underlay.(utils.MultiWriter); ok { + uc.mw = mw + } + + return uc, nil } } diff --git a/proxy/trojan/server.go b/proxy/trojan/server.go index 7624d25..4523101 100644 --- a/proxy/trojan/server.go +++ b/proxy/trojan/server.go @@ -242,14 +242,20 @@ realPart: } else { // 发现直接返回 underlay 反倒无法利用readv, 所以还是统一用包装过的. 目前利用readv是可以加速的. - return &UserTCPConn{ + uc := &UserTCPConn{ Conn: underlay, User: theUser.(User), optionalReader: io.MultiReader(readbuf, underlay), remainFirstBufLen: readbuf.Len(), underlayIsBasic: netLayer.IsBasicConn(underlay), isServerEnd: true, - }, nil, targetAddr, nil + } + + if mw, ok := underlay.(utils.MultiWriter); ok { + uc.mw = mw + } + + return uc, nil, targetAddr, nil } } diff --git a/proxy/trojan/tcpconn.go b/proxy/trojan/tcpconn.go index ab63972..13303b7 100644 --- a/proxy/trojan/tcpconn.go +++ b/proxy/trojan/tcpconn.go @@ -20,6 +20,8 @@ type UserTCPConn struct { underlayIsBasic bool isServerEnd bool + + mw utils.MultiWriter } func (c *UserTCPConn) Upstream() net.Conn { @@ -110,8 +112,8 @@ func (c *UserTCPConn) WriteBuffers(buffers [][]byte) (int64, error) { if c.underlayIsBasic { return utils.BuffersWriteTo(buffers, c.Conn) - } else if mr, ok := c.Conn.(utils.MultiWriter); ok { - return mr.WriteBuffers(buffers) + } else if c.mw != nil { + return c.mw.WriteBuffers(buffers) } } diff --git a/proxy/vless/client.go b/proxy/vless/client.go index 218a289..b50e963 100644 --- a/proxy/vless/client.go +++ b/proxy/vless/client.go @@ -163,6 +163,9 @@ func (c *Client) Handshake(underlay net.Conn, firstPayload []byte, target netLay uc.br = underlay.(utils.BuffersReader) } } + if mw, ok := underlay.(utils.MultiWriter); ok { + uc.mw = mw + } return uc, nil } else { diff --git a/proxy/vless/server.go b/proxy/vless/server.go index cb7e578..ff11bb9 100644 --- a/proxy/vless/server.go +++ b/proxy/vless/server.go @@ -306,6 +306,9 @@ realPart: uc.br = underlay.(utils.BuffersReader) } } + if mw, ok := underlay.(utils.MultiWriter); ok { + uc.mw = mw + } return uc, nil, targetAddr, nil } diff --git a/proxy/vless/tcpconn.go b/proxy/vless/tcpconn.go index 75f8feb..8094a24 100644 --- a/proxy/vless/tcpconn.go +++ b/proxy/vless/tcpconn.go @@ -32,6 +32,7 @@ type UserTCPConn struct { readvType int br utils.BuffersReader + mw utils.MultiWriter } func (u *UserTCPConn) GetProtocolVersion() int { @@ -127,9 +128,9 @@ func (c *UserTCPConn) WriteBuffers(buffers [][]byte) (int64, error) { return utils.BuffersWriteTo(buffers, c.Conn) - } else if mr, ok := c.Conn.(utils.MultiWriter); ok { + } else if c.mw != nil { - return mr.WriteBuffers(buffers) + return c.mw.WriteBuffers(buffers) } } //发现用tls时,下面的 MergeBuffers然后一起写入的方式,能提供巨大的性能提升 diff --git a/tlsLayer/fake.go b/tlsLayer/fake.go index a727415..01efc41 100644 --- a/tlsLayer/fake.go +++ b/tlsLayer/fake.go @@ -85,6 +85,8 @@ func (c *FakeAppDataConn) Upstream() any { func (c *FakeAppDataConn) WriteBuffers(bss [][]byte) (int64, error) { // 在server端,从direct用readv读到的数据可以用 WriteBuffers写回,可以加速 + //不过虽然如此, 一般情况下是不会发生的,除非 你裸奔使用vless/trojan, + //不然就是用vmess/ss,除非 vmess/ss实现 WriteBuffers, 否则这里不会被调用到 allLen := utils.BuffersLen(bss) err := WriteAppDataHeader(c.Conn, allLen) diff --git a/utils/buffers.go b/utils/buffers.go index 6a97e59..fc04d9a 100644 --- a/utils/buffers.go +++ b/utils/buffers.go @@ -144,13 +144,14 @@ func RecoverBuffers(bs [][]byte, oldLen, old_sub_len int) [][]byte { return bs } -func BuffersWriteTo(bs [][]byte, writer io.Writer) (num int64, err2 error) { +// 按顺序将bs内容写入writer +func BuffersWriteTo(bs [][]byte, writer io.Writer) (num int64, err error) { for _, b := range bs { - nb, err := writer.Write(b) + nb, e := writer.Write(b) num += int64(nb) - if err != nil { + if e != nil { - err2 = err + err = e break } }