mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-12-24 13:27:56 +08:00
修订代码
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
|
||||
@@ -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然后一起写入的方式,能提供巨大的性能提升
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user