zoukankan      html  css  js  c++  java
  • GS与数据库打交道

    GS与数据库打交道
    link_stat stat = (link_stat)rPkt.size;
    if (stat == link_stat::link_connected)
    {
        GameChannel* pNewGC        = new GameChannel();
        pNewGC->m_nChannelId    = rPkt.channel_id;//客户端唯一标识
        pNewGC->m_pDataLayer    = m_spDataLayer.get();//GC直接发包到客户端
        pNewGC->m_pShare        = this;//我知道share是所有玩家,所有地图,但具体GameServer与Share什么关系还不清
        pNewGC->m_pAsynDBC        = this->m_spAsynDBC.get();//GC访问数据库
    
        m_vecChannel[rPkt.channel_id] = pNewGC;//放到玩家通道中    
        m_LiveMgr.Add(rPkt.channel_id);
    }
    else if (stat == link_stat::link_disconnected || stat == link_stat::link_connect_failed )
    {
        GameChannel* pDisconnectGC = m_vecChannel[rPkt.channel_id];
        if (pDisconnectGC)
        {
            //如果进入了地图,保存人物信息时会调用push_freeQueue + 滞空m_Channels[channel_id],
            pDisconnectGC->OnDisconnect();//处理玩家下线工作,包括地图,感觉这个只是处理GS这边的
    
            //如果未进地图就下线,直接断开;不用保存角色详细数据,可直接放入释放队列中
            if (!pDisconnectGC->m_pMap)//这需要看人物下线MS怎么发包过来,处理什么事情了,没进入地图就不需要等MS发数据过来然后GS保存
            {
                AutoFreeGC(pDisconnectGC);//释放GC,这个需要没有数据库返回才去释放
            }
        }
        m_LiveMgr.Remove(rPkt.channel_id);
    }
    
    bool GameChannel::OnReceiveData(void* pData, int nLen)
    {
        if (!BaseChannel::OnReceiveData(pData, nLen))//感觉在BC里面处理那些最基本的功能
        {
            if(m_eGameState != eGameState_EnterMap)
                return false; 
    
            m_pMap->Gs2MsData(gs2ms_转client_cmd, m_nChannelId, pData, nLen);
        }
        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);//m_mapPktAnalysis是在GC里面绑定的,然后再BC里面回调,这种用法还真不熟
        if(it == m_mapPktAnalysis.end())
            return false;
    
        return it->second(Ptl.content, Ptl.size);
    }
    
    看看其是怎么访问数据库的
    bool GameChannel::OnLogin(void* pData, int nLen)
    {
        struct UserInfo
        {
            int userID;                //对应数据库中的_id
            char userName[20];        //用户名
            char userPwd[20];        //用户密码
        };
    
        if(m_eGameState != eGameState_OnlyConnect)
            return false;
        UserInfo* info = (UserInfo*)pData;
        //m_fnGetUserID一个function,function就相当于函数指针,函数地址是存储在代码区里面,也是有地址的,将这个指针传到ASYNDB,然后回调这个指针,也是可以
        m_pAsynDBC->GetUserID(&m_fnGetUserID ,info->userName);//这样直接放个命令到数据库,在回调,服务器不用去等待结果,这个也是比较基本的用法了,刚开始搞几天都不太理解
        IncDBAsk();
    
        m_pUserInfo = new ShuiHu::UserInfo;
        strncpy(m_pUserInfo->m_szUserPwd, info->userPwd, MAX_NAME_LEN);
        return true;
    }
    GS与数据打交道不多就是GameServer打开的时候获取道具,帮会信息,最主要的是那个m_spAsynDBC->Drive();驱动回调
    //其实总结起来就是每个GC有个数据库的指针,然后每次绑定一个GC的函数,然后数据库回调,当然每个类的对象的函数都有地址空间的,对应于这个地址空间不熟
  • 相关阅读:
    .net环境中引用js文件乱码解决办法(转)
    js中frame对象几种访问方法
    js中建立像泛型、哈希表那样的对象
    VB编程操作AutoCAD长度型尺寸标注
    VB编程设置AutoCAD文字样式
    VB编程操作AutoCAD角度型尺寸标注
    VB编程操作AutoCAD单行文字
    VB编程操作AutoCAD块对象
    VB编程控制AutoCAD颜色属性
    VB编程操作AutoCAD坐标型尺寸标注
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4148976.html
Copyright © 2011-2022 走看看