From 4ece4b84dd82adc8f55503c8a39038459defd5d7 Mon Sep 17 00:00:00 2001 From: hahahrfool <75717694+hahahrfool@users.noreply.github.com> Date: Wed, 30 Mar 2022 21:32:35 +0800 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 --- main.go | 28 ++++++++++++++++++++++------ netLayer/readv.go | 10 +++++++--- netLayer/relay.go | 1 + proxy/http/server.go | 1 + proxy/socks5/server.go | 4 ++-- proxy/vless/vless.go | 2 ++ utils/log.go | 2 +- utils/pool.go | 16 +++++++++++++++- 8 files changed, 51 insertions(+), 13 deletions(-) diff --git a/main.go b/main.go index b1b49c6..5832b67 100644 --- a/main.go +++ b/main.go @@ -75,13 +75,29 @@ func init() { } +func isFlagPassed(name string) bool { + found := false + flag.Visit(func(f *flag.Flag) { + if f.Name == name { + found = true + } + }) + return found +} + func main() { printVersion() flag.Parse() - cmdLL := utils.LogLevel - cmdUseReadv := netLayer.UseReadv + utils.AdjustBufSize() + + ll_beforeLoadConfigFile := utils.LogLevel + usereadv_beforeLoadConfigFile := netLayer.UseReadv + + cmdLL_given := isFlagPassed("ll") + cmdUseReadv_given := isFlagPassed("readv") + loadConfig() if confMode < 0 { @@ -90,16 +106,16 @@ func main() { //有点尴尬, 读取配置文件必须要用命令行参数,而配置文件里的部分配置又会覆盖部分命令行参数 - if cmdLL != utils.DefaultLL && utils.LogLevel != cmdLL { + if cmdLL_given && utils.LogLevel != ll_beforeLoadConfigFile { //配置文件配置了日志等级, 但是因为 命令行给出的值优先, 所以要设回 - utils.LogLevel = cmdLL + utils.LogLevel = ll_beforeLoadConfigFile } - if cmdUseReadv != netLayer.UseReadv { + if cmdUseReadv_given && netLayer.UseReadv != usereadv_beforeLoadConfigFile { //配置文件配置了readv, 但是因为 命令行给出的值优先, 所以要设回 - netLayer.UseReadv = cmdUseReadv + netLayer.UseReadv = usereadv_beforeLoadConfigFile } fmt.Println("Log Level:", utils.LogLevel) diff --git a/netLayer/readv.go b/netLayer/readv.go index dfa10ce..bb63279 100644 --- a/netLayer/readv.go +++ b/netLayer/readv.go @@ -18,8 +18,12 @@ import ( //在内网单机自己连自己测速时,readv会导致降速. -const readv_buffer_allocLen = 8 -const ReadvSingleBufLen = 4096 +const ( + readv_buffer_allocLen = 8 + ReadvSingleBufLen = 4096 + + DefaultReadvOption = true +) var ( // readv pool, 缓存 mr和buffers,进一步减轻内存分配负担 @@ -29,7 +33,7 @@ var ( ) func init() { - flag.BoolVar(&UseReadv, "readv", true, "toggle the use of 'readv' syscall") + flag.BoolVar(&UseReadv, "readv", DefaultReadvOption, "toggle the use of 'readv' syscall") readvPool = sync.Pool{ New: newReadvMem, diff --git a/netLayer/relay.go b/netLayer/relay.go index a3c7591..725b8aa 100644 --- a/netLayer/relay.go +++ b/netLayer/relay.go @@ -171,6 +171,7 @@ classic: bs := utils.GetPacket() n, e := readConn.Read(bs) if e != nil { + utils.PutPacket(bs) return 0, e } n, e = writeConn.Write(bs[:n]) diff --git a/proxy/http/server.go b/proxy/http/server.go index 9487d81..2be69b5 100644 --- a/proxy/http/server.go +++ b/proxy/http/server.go @@ -50,6 +50,7 @@ func (_ Server) Name() string { func (s *Server) Handshake(underlay net.Conn) (newconn io.ReadWriter, targetAddr *netLayer.Addr, err error) { var b = utils.GetMTU() //一般要获取请求信息,不需要那么长; 就算是http,加了path,也不用太长 + //因为要储存为 firstdata,所以也无法直接放回 newconn = underlay diff --git a/proxy/socks5/server.go b/proxy/socks5/server.go index 622ec77..c257068 100644 --- a/proxy/socks5/server.go +++ b/proxy/socks5/server.go @@ -54,8 +54,8 @@ func (s *Server) Handshake(underlay net.Conn) (io.ReadWriter, *netLayer.Addr, er } defer underlay.SetReadDeadline(time.Time{}) - buf := utils.GetPacket() - defer utils.PutPacket(buf) + buf := utils.GetMTU() + defer utils.PutBytes(buf) // Read hello message // 一般握手包发来的是 [5 1 0] diff --git a/proxy/vless/vless.go b/proxy/vless/vless.go index c419aa3..b474770 100644 --- a/proxy/vless/vless.go +++ b/proxy/vless/vless.go @@ -262,10 +262,12 @@ func (uc *UserConn) Read(p []byte) (int, error) { n, e := from.Read(bs) if e != nil { + utils.PutPacket(bs) return 0, e } if n < 2 { + utils.PutPacket(bs) return 0, errors.New("vless response head too short") } n = copy(p, bs[2:n]) diff --git a/utils/log.go b/utils/log.go index d85c257..358b425 100644 --- a/utils/log.go +++ b/utils/log.go @@ -7,7 +7,7 @@ const ( Log_debug = iota Log_info Log_warning - Log_error + Log_error //error一般用于输出一些 连接错误或者客户端协议错误之类的, 但不致命 Log_fatal //Log_off //不支持不打印致命输出。既然致命我们一定要尸检然后查看病因啊 diff --git a/utils/pool.go b/utils/pool.go index f26ca55..fbf4303 100644 --- a/utils/pool.go +++ b/utils/pool.go @@ -2,6 +2,7 @@ package utils import ( "bytes" + "flag" "sync" ) @@ -24,9 +25,13 @@ const StandardBytesLength int = 1500 // https://en.wikipedia.org/wiki/Maximum_transmission_unit //本作设定的最大buf大小,64k -const MaxBufLen = 64 * 1024 +var MaxBufLen = DefaultMaxBufLen + +const DefaultMaxBufLen = 64 * 1024 func init() { + flag.IntVar(&MaxBufLen, "bl", DefaultMaxBufLen, "buf len") + standardBytesPool = sync.Pool{ New: func() interface{} { return make([]byte, StandardBytesLength) @@ -46,6 +51,15 @@ func init() { } } +//给了参数调节buf大小后,需要更新pool +func AdjustBufSize() { + standardPacketPool = sync.Pool{ + New: func() interface{} { + return make([]byte, MaxBufLen) + }, + } +} + //从Pool中获取一个 *bytes.Buffer func GetBuf() *bytes.Buffer { return bufPool.Get().(*bytes.Buffer)