From 6b64de06a25d766e9166d6a0a6068c5174aade37 Mon Sep 17 00:00:00 2001 From: duanhf2012 <6549168@qq.com> Date: Wed, 22 Mar 2023 14:59:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A2=9E=E5=8A=A0TcpService?= =?UTF-8?q?=E7=9A=84=E5=8C=85=E9=95=BF=E5=BA=A6=E5=AD=97=E6=AE=B5=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- network/tcp_client.go | 10 ++++++-- network/tcp_msg.go | 24 ++++++++++-------- network/tcp_server.go | 39 ++++++++++++++++++----------- sysservice/tcpservice/tcpservice.go | 4 +++ 4 files changed, 51 insertions(+), 26 deletions(-) diff --git a/network/tcp_client.go b/network/tcp_client.go index 90105cf..8760c32 100644 --- a/network/tcp_client.go +++ b/network/tcp_client.go @@ -71,11 +71,17 @@ func (client *TCPClient) init() { if client.MaxMsgLen == 0 { client.MaxMsgLen = Default_MaxMsgLen } + if client.LenMsgLen ==0 { + client.LenMsgLen = Default_LenMsgLen + } + maxMsgLen := client.MsgParser.getMaxMsgLen(client.LenMsgLen) + if client.MaxMsgLen > maxMsgLen { + client.MaxMsgLen = maxMsgLen + log.SRelease("invalid MaxMsgLen, reset to ", maxMsgLen) + } client.cons = make(ConnSet) client.closeFlag = false - - // msg parser client.MsgParser.init() } diff --git a/network/tcp_msg.go b/network/tcp_msg.go index fed578d..868417c 100644 --- a/network/tcp_msg.go +++ b/network/tcp_msg.go @@ -4,6 +4,7 @@ import ( "encoding/binary" "errors" "io" + "math" ) // -------------- @@ -19,18 +20,21 @@ type MsgParser struct { } +func (p *MsgParser) getMaxMsgLen(lenMsgLen int) uint32 { + switch p.LenMsgLen { + case 1: + return math.MaxUint8 + case 2: + return math.MaxUint16 + case 4: + return math.MaxUint32 + default: + panic("LenMsgLen value must be 1 or 2 or 4") + } +} + func (p *MsgParser) init(){ p.INetMempool = NewMemAreaPool() - - for i:=1;i<=4;i*=2 { - max := uint32(1<<(i*8)-1) - if p.MaxMsgLen <= max { - p.LenMsgLen = i - return - } - } - - panic("MaxMsgLen value must be less than 4294967295") } // goroutine safe diff --git a/network/tcp_server.go b/network/tcp_server.go index 889efdc..3262c23 100644 --- a/network/tcp_server.go +++ b/network/tcp_server.go @@ -7,13 +7,16 @@ import ( "time" ) -const Default_ReadDeadline = time.Second*30 //30s -const Default_WriteDeadline = time.Second*30 //30s -const Default_MaxConnNum = 1000000 -const Default_PendingWriteNum = 10000 -const Default_LittleEndian = false -const Default_MinMsgLen = 2 -const Default_MaxMsgLen = 65535 +const( + Default_ReadDeadline = time.Second*30 //默认读超时30s + Default_WriteDeadline = time.Second*30 //默认写超时30s + Default_MaxConnNum = 1000000 //默认最大连接数 + Default_PendingWriteNum = 100000 //单连接写消息Channel容量 + Default_LittleEndian = false //默认大小端 + Default_MinMsgLen = 2 //最小消息长度2byte + Default_LenMsgLen = 2 //包头字段长度占用2byte + Default_MaxMsgLen = 65535 //最大消息长度 +) type TCPServer struct { Addr string @@ -28,8 +31,7 @@ type TCPServer struct { mutexConns sync.Mutex wgLn sync.WaitGroup wgConns sync.WaitGroup - - // msg parser + MsgParser } @@ -54,9 +56,9 @@ func (server *TCPServer) init() { log.SRelease("invalid PendingWriteNum, reset to ", server.PendingWriteNum) } - if server.MinMsgLen <= 0 { - server.MinMsgLen = Default_MinMsgLen - log.SRelease("invalid MinMsgLen, reset to ", server.MinMsgLen) + if server.LenMsgLen <= 0 { + server.LenMsgLen = Default_LenMsgLen + log.SRelease("invalid LenMsgLen, reset to ", server.LenMsgLen) } if server.MaxMsgLen <= 0 { @@ -64,6 +66,17 @@ func (server *TCPServer) init() { log.SRelease("invalid MaxMsgLen, reset to ", server.MaxMsgLen) } + maxMsgLen := server.MsgParser.getMaxMsgLen(server.LenMsgLen) + if server.MaxMsgLen > maxMsgLen { + server.MaxMsgLen = maxMsgLen + log.SRelease("invalid MaxMsgLen, reset to ", maxMsgLen) + } + + if server.MinMsgLen <= 0 { + server.MinMsgLen = Default_MinMsgLen + log.SRelease("invalid MinMsgLen, reset to ", server.MinMsgLen) + } + if server.WriteDeadline == 0 { server.WriteDeadline = Default_WriteDeadline log.SRelease("invalid WriteDeadline, reset to ", server.WriteDeadline.Seconds(),"s") @@ -80,8 +93,6 @@ func (server *TCPServer) init() { server.ln = ln server.conns = make(ConnSet) - server.INetMempool = NewMemAreaPool() - server.MsgParser.init() } diff --git a/sysservice/tcpservice/tcpservice.go b/sysservice/tcpservice/tcpservice.go index 3678204..46875ae 100644 --- a/sysservice/tcpservice/tcpservice.go +++ b/sysservice/tcpservice/tcpservice.go @@ -90,6 +90,10 @@ func (tcpService *TcpService) OnInit() error{ if ok == true { tcpService.tcpServer.LittleEndian = LittleEndian.(bool) } + LenMsgLen,ok := tcpCfg["LenMsgLen"] + if ok == true { + tcpService.tcpServer.LenMsgLen = int(LenMsgLen.(float64)) + } MinMsgLen,ok := tcpCfg["MinMsgLen"] if ok == true { tcpService.tcpServer.MinMsgLen = uint32(MinMsgLen.(float64))