KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
查看: 133|回复: 1

消息解析相关

[复制链接]

3

主题

4

帖子

23

积分

新手上路

Rank: 1

积分
23
发表于 2018-8-23 11:42:35 | 显示全部楼层 |阅读模式
先贴个代码
void PacketReader::processMessages(KBEngine::Network::MessageHandlers* pMsgHandlers, Packet* pPacket)
{
        while(pPacket->length() > 0 || pFragmentStream_ != NULL)
        {
                if(fragmentDatasFlag_ == FRAGMENT_DATA_UNKNOW)
                {
                        // 如果没有ID信息,先获取ID
                        if(currMsgID_ == 0)
                        {
                                if(NETWORK_MESSAGE_ID_SIZE > 1 && pPacket->length() < NETWORK_MESSAGE_ID_SIZE)
                                {
                                        writeFragmentMessage(FRAGMENT_DATA_MESSAGE_ID, pPacket, NETWORK_MESSAGE_ID_SIZE);
                                        break;
                                }

                                (*pPacket) >> currMsgID_;
                                pPacket->messageID(currMsgID_);
                        }

                        Network::MessageHandler* pMsgHandler = pMsgHandlers->find(currMsgID_);

                        if(pMsgHandler == NULL)
                        {
                                MemoryStream* pPacket1 = pFragmentStream_ != NULL ? pFragmentStream_ : pPacket;
                                TRACE_MESSAGE_PACKET(true, pPacket1, pMsgHandler, pPacket1->length(), pChannel_->c_str(), false);
                                
                                // 用作调试时比对
                                uint32 rpos = pPacket1->rpos();
                                pPacket1->rpos(0);
                                TRACE_MESSAGE_PACKET(true, pPacket1, pMsgHandler, pPacket1->length(), pChannel_->c_str(), false);
                                pPacket1->rpos(rpos);

                                ERROR_MSG(fmt::format("PacketReader::processMessages: not found msgID={}, msglen={}, from {}.\n",
                                        currMsgID_, pPacket1->length(), pChannel_->c_str()));

                                currMsgID_ = 0;
                                currMsgLen_ = 0;
                                pChannel_->condemn();
                                break;
                        }


如上, 当msgID 没有对应的pMsgHandler 时, 当前packet对象被回收, 数据也因此丢失,那么,该packet里的其他消息是不是也得不到处理, 其次如果当前packet包含下一个包里的
某个消息的消息体头部,那么下一个packet是不是也没法正确处理
回复

使用道具 举报

5

主题

3497

帖子

214748万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2147483647

引擎扛把子

发表于 2018-8-24 16:13:42 | 显示全部楼层
只要有包出错, 连接可以认为不合法了, 后续都不会处理
QQ:3603661
3603661@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-10 18:24 , Processed in 0.060998 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表