mirror of
https://github.com/FlourishingWorld/hk4e.git
synced 2026-02-04 14:22:26 +08:00
tcp socket协议分割解析优化
This commit is contained in:
@@ -287,7 +287,6 @@ func (k *KcpConnectManager) recvHandle(session *Session) {
|
||||
conn := session.conn
|
||||
convId := conn.GetConv()
|
||||
recvBuf := make([]byte, PacketMaxLen)
|
||||
dataBuf := make([]byte, 0, 1500)
|
||||
pktFreqLimitCounter := 0
|
||||
pktFreqLimitTimer := time.Now().UnixNano()
|
||||
for {
|
||||
@@ -313,7 +312,7 @@ func (k *KcpConnectManager) recvHandle(session *Session) {
|
||||
}
|
||||
recvData := recvBuf[:recvLen]
|
||||
kcpMsgList := make([]*KcpMsg, 0)
|
||||
DecodeBinToPayload(recvData, &dataBuf, convId, &kcpMsgList, session.xorKey)
|
||||
DecodeBinToPayload(recvData, convId, &kcpMsgList, session.xorKey)
|
||||
for _, v := range kcpMsgList {
|
||||
protoMsgList := ProtoDecode(v, k.serverCmdProtoMap, k.clientCmdProtoMap)
|
||||
for _, vv := range protoMsgList {
|
||||
|
||||
@@ -32,21 +32,16 @@ type KcpMsg struct {
|
||||
ProtoData []byte
|
||||
}
|
||||
|
||||
func DecodeBinToPayload(data []byte, dataBuf *[]byte, convId uint64, kcpMsgList *[]*KcpMsg, xorKey []byte) {
|
||||
func DecodeBinToPayload(data []byte, convId uint64, kcpMsgList *[]*KcpMsg, xorKey []byte) {
|
||||
// xor解密
|
||||
endec.Xor(data, xorKey)
|
||||
DecodeLoop(data, dataBuf, convId, kcpMsgList)
|
||||
DecodeLoop(data, convId, kcpMsgList)
|
||||
}
|
||||
|
||||
func DecodeLoop(data []byte, dataBuf *[]byte, convId uint64, kcpMsgList *[]*KcpMsg) {
|
||||
if len(*dataBuf) != 0 {
|
||||
// 取出之前的缓冲区数据
|
||||
data = append(*dataBuf, data...)
|
||||
*dataBuf = make([]byte, 0, 1500)
|
||||
}
|
||||
func DecodeLoop(data []byte, convId uint64, kcpMsgList *[]*KcpMsg) {
|
||||
// 长度太短
|
||||
if len(data) < 12 {
|
||||
logger.Debug("packet len less 12 byte")
|
||||
logger.Error("packet len less than 12 byte")
|
||||
return
|
||||
}
|
||||
// 头部幻数错误
|
||||
@@ -66,13 +61,8 @@ func DecodeLoop(data []byte, dataBuf *[]byte, convId uint64, kcpMsgList *[]*KcpM
|
||||
logger.Error("packet len too long")
|
||||
return
|
||||
}
|
||||
haveMorePacket := false
|
||||
if len(data) > packetLen {
|
||||
// 有不止一个包
|
||||
haveMorePacket = true
|
||||
} else if len(data) < packetLen {
|
||||
// 这一次没收够 放入缓冲区
|
||||
*dataBuf = append(*dataBuf, data...)
|
||||
if len(data) < packetLen {
|
||||
logger.Error("packet len not enough")
|
||||
return
|
||||
}
|
||||
// 尾部幻数错误
|
||||
@@ -91,9 +81,9 @@ func DecodeLoop(data []byte, dataBuf *[]byte, convId uint64, kcpMsgList *[]*KcpM
|
||||
kcpMsg.HeadData = headData
|
||||
kcpMsg.ProtoData = protoData
|
||||
*kcpMsgList = append(*kcpMsgList, kcpMsg)
|
||||
// 递归解析
|
||||
if haveMorePacket {
|
||||
DecodeLoop(data[packetLen:], dataBuf, convId, kcpMsgList)
|
||||
// 有不止一个包 递归解析
|
||||
if len(data) > packetLen {
|
||||
DecodeLoop(data[packetLen:], convId, kcpMsgList)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user