修订代码

This commit is contained in:
e1732a364fed
2000-01-01 00:00:00 +00:00
parent e841d258b1
commit 50d7e373ce
8 changed files with 36 additions and 12 deletions

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -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)
}
}

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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然后一起写入的方式能提供巨大的性能提升

View File

@@ -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)

View File

@@ -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
}
}