zoukankan      html  css  js  c++  java
  • 客户端发包 GS端接收

    客户端发包,GS接收
    bool GameServer::ProcessLoop(packet& rPkt)//GS线程做的
    {
        if(false == m_spDataLayer->Recv(rPkt))
            return true;//没数据了
        
        if(rPkt.is_data)
        {
            if(!rPkt.data)//数据为空
                return false;
    
            GameChannel* pGC = m_vecChannel[rPkt.channel_id];//m_vecChannelGS里面所有玩家的通道,通过channelid唯一标识
            if(pGC)
                pGC->OnReceiveData(rPkt.data, rPkt.size);
        
            m_LiveMgr.OnLive(rPkt.channel_id);
        }
    }
    //还是第一次看到这种覆盖的用法,BaseChannel::OnReceiveData直接调用父类的函数
    //现在感觉这样写比较好,子类可以处理自己的逻辑,不然都放到BaseChannel::OnReceiveData,耦合度变大了
    //gs2ms_转client_cmd从GS发送到MS命令,在GS和MS之间定义的协议属于内部协议,如果发平行关系就太多了,
    //通过内部定义的几个协议,然后再MS里面在分,感觉这样清晰很多
    //关于哪个包发到哪一层,一般发到GS这边的和地图没关系,或者是跨地图的操作,不然都会讲这个包发到MS里面,其实这个我有点模糊,回头再详看
    bool GameChannel::OnReceiveData(void* pData, int nLen)
    {
        if(!BaseChannel::OnReceiveData(pData, nLen))
        {
            if(m_eGameState != eGameState_EnterMap)//没有进入地图
                return false; 
            m_pMap->Gs2MsData(gs2ms_转client_cmd, m_nChannelId, pData, nLen);//gs2ms_转client_cmd,难道这个消息到MS里面就一定会转到客户端吗?不一定吧
        }
        return true;
    }
    
    bool BaseChannel::OnReceiveData(void* data, int len)
    {
        Protocol Ptl = {0};
        if(!Ptl.from_buffer(data, len))
        {
            return false;
        }
        auto it = m_mapPktAnalysis.find(Ptl.cmd_type);
        if(it == m_mapPktAnalysis.end())//m_mapPktAnalysis是在new GameChannel的时候就已经绑定好了
        {
            //[]测试
            //m_map->onCmd(data, len);
            return false;//表示不是GS这一层的包,是map server里面的包
        }
        return it->second(Ptl.content, Ptl.size);//调用相应的绑定函数
    
    //    return true;
    }
    
    void Map::Gs2MsData(int cmd, int channel_id, void* data, int len)
    {
        MapPkt pkt;
        pkt.channelId = channel_id;
        pkt.data = m_memPool.popPkt(len);//因为不同线程,需要分配一块内存,用于保存包数据
        memcpy(pkt.data, data, len);
        pkt.len = len;
        pkt.cmd = cmd;
    
        PushPkt(pkt);
    }
  • 相关阅读:
    decltype类型指示符
    vector的使用
    参数使用
    CSPS模拟 43
    CSPS模拟 41
    CSPS模拟 42
    NOIP模拟 40
    NOIP模拟 39
    NOIP模拟 38
    NOIP模拟 37
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4117140.html
Copyright © 2011-2022 走看看