首页 > 代码库 > 一个包的net到gs流程
一个包的net到gs流程
再来看看一个包走共享内存的流程先来看看net进程这块如何处理的{//用shareData这种类型封装刚才从无锁队列中取到的包 shareData sd; sd.channel_id = pkt.channel_id; sd.data = pkt.data; sd.is_data = pkt.is_data; sd.size = pkt.size; auto hr = m_spShareMemInter->pushA(sd);//将这个包放入共享内存中}//具体看下是如何放入共享内存的bool shareMemInterOneway::pushIn(shareData sd){ scoped_lock<interprocess_mutex> lock(m_mem镜像->mutex);//需要加进程锁,不同进程访问 shareDataEx sd2; bool hr = m_ProcessMemPool.getPkt(sd.size, sd2); if(!hr) return false; sd2.size = sd.size; sd2.channel_id = sd.channel_id; sd2.is_data = sd.is_data; if(sd.is_data) { memcpy(sd2.data, sd.data, sd.size); } m_ShareMemQue->push_back(sd2); return true;}bool ProcessMemPoolEx::getPkt(int len, shareDataEx& sd){ if(len < 100)//根据长度判断从哪种共享内存中取 return m_ProcessMemPool0.getPkt(len, sd); else if(len < 1000) return m_ProcessMemPool1.getPkt(len, sd); return m_ProcessMemPool2.getPkt(len, sd);}bool ProcessMemPool::getPkt(int len, shareDataEx& sd){ if(len > m_memSize) { //测试 wchar_t tips[50] = {0}; wsprintf(tips, L"Warning100o: len:%d, memSize:%d!", len, m_memSize); MessageBox(NULL, tips/*L"100o"*/, L"1ooo", MB_OK); return false; } if(!m_queue->size()) return false; sd = m_queue->front();//看到这个就应该知道为什么要初始化那个共享的队列 m_queue->pop_front(); sd.data = convertAdd(sd.index); return true;}void* ProcessMemPool::convertAdd(int index){ return (char*)m_start_addr + (index * m_memSize);//正好通过这个index获取共享内存池的相应地址}附:m_queue初始化代码:{ for (int i = 0; i < m_buffer_num; i++) { shareDataEx sd; sd.index = i;//正是用这个index代表了内存池的哪一块 sd.size = 0; sd.total_size = m_memSize; m_queue->push_back(sd); }}bool shareMemInterOneway::pushIn(shareData sd){ scoped_lock<interprocess_mutex> lock(m_mem镜像->mutex); shareDataEx sd2; bool hr = m_ProcessMemPool.getPkt(sd.size, sd2);//在调用Getpkt之后就会获得一块内存的地址 if(!hr) return false; sd2.size = sd.size; sd2.channel_id = sd.channel_id; sd2.is_data = sd.is_data; if(sd.is_data) { memcpy(sd2.data, sd.data, sd.size);//然后就将传递进来的sd内存复制到共享内存中的内存池,而sd中的这个内存就是那个m_recvBuff里面的,有个问题就是这个m_recvBuff为什么要分配100m的内存,需要这么大么? } m_ShareMemQue->push_back(sd2);//然后他将这个sd2放到放到交互的共享队列中,注意这里面的内存还是分配在共享内存池中的,m_ShareMemQue中只是保存了一个地址而已 return true;}//这样一个包就放入共享的队列中了
一个包的net到gs流程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。