首页 > 代码库 > 一个包从共享内存到达服务器
一个包从共享内存到达服务器
一个包到从共享内存到GS流程上次说到一个包从共享内存池取到一个包之后放入共享队列中hr = m_spShareMemInter->pushA(sd);看看GS这边是如何取包的主线程创建了一个子线程void GameServer::ProcessThread(){ try { ProcessThreadTry(); } catch (...) { DWORD dwErrno = GetLastError(); MessageBox(NULL, L"GameServer::process_thread异常", L"异常", MB_OK); }}void GameServer::ProcessThreadTry(){ int nCount = 0; packet Pkt; Pkt.data = new char[1024 * 100];//事先分配内存 I_TimerFactory* pTimeFactory = GetPlug(TimerFactory); for (;;) { ProcMapSendData();//map发过来的数据 m_spAsynDBC->Drive();//数据库回调 bool bRcvDataRet = ProcessLoop(Pkt);//网络层的数据,现在只看这个 ProcMapSendData(); } //...(下面还有很多,暂时不看)}if(!m_spShareMemInter->popB(tmpShareData))来看看这个popB的实现bool shareMemInterOneway::popOut(shareData& sd){ { if(m_ShareMemQue->size() == 0)//m_ShareMemQue就是交互的真正的队列,注意他里面保存一个内存池中的地址 return false; } { scoped_lock<interprocess_mutex> lock(m_mem镜像->mutex);//进程锁 if(m_ShareMemQue->size() == 0) return false; auto sd2 = m_ShareMemQue->front(); m_ShareMemQue->pop_front(); sd.size = sd2.size; sd.channel_id = sd2.channel_id; sd.is_data = sd2.is_data; if(sd2.is_data) { try { memcpy(sd.data, m_ProcessMemPool.convertAdd(sd2.total_size, sd2.index), sd.size);//从内存池中拷贝出来 } catch(...) { MessageBox(NULL, L"shareMemInterOneway::popB", L"1ooo", MB_OK); } } m_ProcessMemPool.pushPkt(sd2);//归还内存池中的内存 } return true;}bool GameServer::ProcessLoop(packet& rPkt){ if(false == m_spDataLayer->Recv(rPkt)) return true;//没数据了 if(rPkt.is_data) { if(!rPkt.data) return false; GameChannel* pGC = m_vecChannel[rPkt.channel_id];//根据channelid确定是哪个channel,一个玩家对应一个channel if(pGC) pGC->OnReceiveData(rPkt.data, rPkt.size); m_LiveMgr.OnLive(rPkt.channel_id); } else//其他事件如连接断开,都是libevent事件 { }}//一个包历经千辛万苦才打到服务器,对于到时怎么调用不同的函数,随后在看
一个包从共享内存到达服务器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。