优化增加TcpService的包长度字段配置

This commit is contained in:
duanhf2012
2023-03-22 14:59:22 +08:00
parent 95b153f8cf
commit 6b64de06a2
4 changed files with 51 additions and 26 deletions

View File

@@ -71,11 +71,17 @@ func (client *TCPClient) init() {
if client.MaxMsgLen == 0 { if client.MaxMsgLen == 0 {
client.MaxMsgLen = Default_MaxMsgLen 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.cons = make(ConnSet)
client.closeFlag = false client.closeFlag = false
// msg parser
client.MsgParser.init() client.MsgParser.init()
} }

View File

@@ -4,6 +4,7 @@ import (
"encoding/binary" "encoding/binary"
"errors" "errors"
"io" "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(){ func (p *MsgParser) init(){
p.INetMempool = NewMemAreaPool() 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 // goroutine safe

View File

@@ -7,13 +7,16 @@ import (
"time" "time"
) )
const Default_ReadDeadline = time.Second*30 //30s const(
const Default_WriteDeadline = time.Second*30 //30s Default_ReadDeadline = time.Second*30 //默认读超时30s
const Default_MaxConnNum = 1000000 Default_WriteDeadline = time.Second*30 //默认写超时30s
const Default_PendingWriteNum = 10000 Default_MaxConnNum = 1000000 //默认最大连接数
const Default_LittleEndian = false Default_PendingWriteNum = 100000 //单连接写消息Channel容量
const Default_MinMsgLen = 2 Default_LittleEndian = false //默认大小端
const Default_MaxMsgLen = 65535 Default_MinMsgLen = 2 //最小消息长度2byte
Default_LenMsgLen = 2 //包头字段长度占用2byte
Default_MaxMsgLen = 65535 //最大消息长度
)
type TCPServer struct { type TCPServer struct {
Addr string Addr string
@@ -28,8 +31,7 @@ type TCPServer struct {
mutexConns sync.Mutex mutexConns sync.Mutex
wgLn sync.WaitGroup wgLn sync.WaitGroup
wgConns sync.WaitGroup wgConns sync.WaitGroup
// msg parser
MsgParser MsgParser
} }
@@ -54,9 +56,9 @@ func (server *TCPServer) init() {
log.SRelease("invalid PendingWriteNum, reset to ", server.PendingWriteNum) log.SRelease("invalid PendingWriteNum, reset to ", server.PendingWriteNum)
} }
if server.MinMsgLen <= 0 { if server.LenMsgLen <= 0 {
server.MinMsgLen = Default_MinMsgLen server.LenMsgLen = Default_LenMsgLen
log.SRelease("invalid MinMsgLen, reset to ", server.MinMsgLen) log.SRelease("invalid LenMsgLen, reset to ", server.LenMsgLen)
} }
if server.MaxMsgLen <= 0 { if server.MaxMsgLen <= 0 {
@@ -64,6 +66,17 @@ func (server *TCPServer) init() {
log.SRelease("invalid MaxMsgLen, reset to ", server.MaxMsgLen) 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 { if server.WriteDeadline == 0 {
server.WriteDeadline = Default_WriteDeadline server.WriteDeadline = Default_WriteDeadline
log.SRelease("invalid WriteDeadline, reset to ", server.WriteDeadline.Seconds(),"s") log.SRelease("invalid WriteDeadline, reset to ", server.WriteDeadline.Seconds(),"s")
@@ -80,8 +93,6 @@ func (server *TCPServer) init() {
server.ln = ln server.ln = ln
server.conns = make(ConnSet) server.conns = make(ConnSet)
server.INetMempool = NewMemAreaPool()
server.MsgParser.init() server.MsgParser.init()
} }

View File

@@ -90,6 +90,10 @@ func (tcpService *TcpService) OnInit() error{
if ok == true { if ok == true {
tcpService.tcpServer.LittleEndian = LittleEndian.(bool) tcpService.tcpServer.LittleEndian = LittleEndian.(bool)
} }
LenMsgLen,ok := tcpCfg["LenMsgLen"]
if ok == true {
tcpService.tcpServer.LenMsgLen = int(LenMsgLen.(float64))
}
MinMsgLen,ok := tcpCfg["MinMsgLen"] MinMsgLen,ok := tcpCfg["MinMsgLen"]
if ok == true { if ok == true {
tcpService.tcpServer.MinMsgLen = uint32(MinMsgLen.(float64)) tcpService.tcpServer.MinMsgLen = uint32(MinMsgLen.(float64))