再来看看一个包走共享内存的流程
先来看看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 < )//根据长度判断从哪种共享内存中取
return m_ProcessMemPool0.getPkt(len, sd);
else if(len < )
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[] = {};
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 = ; i < m_buffer_num; i++)
{
shareDataEx sd;
sd.index = i;//正是用这个index代表了内存池的哪一块
sd.size = ;
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流程的更多相关文章

  1. 一个包的libevent流程

    //一个发包的流程 第一个包就是客户端的心跳包,现在加了版本的包 再来看看这个发包打包过程,过程坚持,但理解费劲 void NGP::OnliveTimer()//客户端心跳,5s发一次 { Send ...

  2. python基础之打/解包及运算符与控制流程

    python基础之打/解包及运算符与控制流程 python中的解压缩(即序列类型的打包和解包) python提供了两个设计元祖和其他序列类型的处理的便利,也就是自动打包与自动解包功能,比如: data ...

  3. 判断一个Activity 判断一个包 是否存在于系统中 的方法

    判断一个包是否存在于系统中(来自网络),经过测试,好用: public boolean checkBrowser(String packageName) { if (packageName == nu ...

  4. python高级编程 编写一个包1

    #目的是:编写,发行python包可重复过程"""1:是缩短开始真正工作之前所需要的设置时间,也就是提供模板2:提供编写包的标准化方法3:简化测试驱动开发方法的使用4:为 ...

  5. Android系统,动态找出一个包下所有的类

    最近在写一个android应用,由于针对不同机型功能很不同,为了隔离变化,希望将各项功能插件化,通过编译开关来控制不同版本的功能,而不是在代码中通过逻辑来判断. 我想了一个办法,用表驱动的方法,结合插 ...

  6. SSIS从理论到实战,再到应用(1)----创建自己的第一个包

    原文:SSIS从理论到实战,再到应用(1)----创建自己的第一个包 其实,如果你使用sql2008的导出导入工具的时候,你就已经在使用包了. 目标:使用sql2008 导入导出工具,导入excel数 ...

  7. npm 是node.js下带的一个包管理工具

    npm 是node.js下带的一个包管理工具          npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...

  8. debian系统的另一个包管理器aptitude

    最近在玩OPI的时候遇到了一个包因为各种依赖问题死活装不上.苦搜很久找到这个aptitude包管理器. 基于debain衍生的各种操作系统比较常用包管理器是apt,不过apt在遇到依赖问题的时候处理得 ...

  9. Android--------从一个包中的Avtivity创建另外另外一个包的Context

    Android中有Context的概念,想必大家都知道.Context可以做很多事情,打开activity.发送广播.打开本包下文件夹和数据库.获取classLoader.获取资源等等.如果我们得到了 ...

随机推荐

  1. LtUpload上传组件

    <?php/** * The Upload class * @author Alex Lee <iuyes@qq.com> * @license http://opensource. ...

  2. onClick事件实现方式(打电话为例子)

    1.在button 中 android:onclick="call" 注意事项:①.方法的名字必须是call ②.区别大小写 ③.call方法必须接收一个View类型的参数 ④.方 ...

  3. WebBrowser里网页根据文字判断来点击链接 无Name及ID时

    uses ActiveX, ComObj, MSHTML; 根据连接文字点击连接- 一般情况下的连接 Procedure HTMLClinkByText(text:string;Wbr:TWebBro ...

  4. Python 初学(一) 标识符

    Python 标识符 在python里,标识符由字母.数字.下划线组成: python中的标识符是区分大小写的: 1)以单下划线开头(_foo)的代表不能直接访问的类属性,需要通过类提供的接口进行访问 ...

  5. JQUERY 判断选择器选择的对象 是否存在

    判断方法: 直接选择判断,是不正确的方法,因为 $(“#id”) 不管对象是否存在都会返回 object . if($("#id")){ alert('存在'); }else{ a ...

  6. Ubuntu下编译内核

    一.下载源代码和编译软件的准备 下载内核源代码:http://www.kernel.org/ 注意,点击2.6.25内核的F版,即完整版. 如果你懒得去网站点联接,运行下列命令:  代码: $cd ~ ...

  7. poj 2631 Roads in the North

    题目连接 http://poj.org/problem?id=2631 Roads in the North Description Building and maintaining roads am ...

  8. exception -----> Functions

    /* current_exception */ exception_ptr current_exception() noexcept; 返回指向当前异常(或其副本)的智能指针[具体返回对象本身还是副本 ...

  9. [转]"error while loading shared libraries: xxx.so.x" 错误的原因和解决办法

    [转]"error while loading shared libraries: xxx.so.x" 错误的原因和解决办法 http://blog.csdn.net/sahuso ...

  10. PB中获取datawindow提交的sql语句

    PB的群里边,有人问的到这个问题,查了一下,综合了两条回答,得到了答案 1.DW 控件的SQLpreview 事件里的sqlsyntax 参数即是 2.pb一般使用占位符优化SQL语句,也就是你看到的 ...