再来看看一个包走共享内存的流程
先来看看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. PHP四大安全策略

    PHP中的文件系统安全.数据库安全.用户数据安全等安全相关的问题. 一.文件系统安全 php如果具有root权限,且在脚本中允许用户删除文件,那么用户提交数据,不进行过滤,就非常有可能删除系统文件 & ...

  2. php教程一,变量

    php是一种动态脚本语言,比较适合web开发. php支持8种变量数据类型: 四种标量类型: boolean(布尔型) integer(整型) float(浮点型,也称作 double) string ...

  3. ROS 端口IP映射 动态IP映射

    chain=dstnat action=dst-nat to-addresses= protocol=tcp dst-address-type=local dst-port= log=no log-p ...

  4. 第三节:卸载AppDomain

    AppDomain很出色的一个能力就是它允许卸载.卸载AppDomain会导致CLR卸载AppDomain中的所有程序集.还会释放AppDomain的Loader堆.为了卸载一个AppDomain,可 ...

  5. sublime text 3 设置

    最近开始用sublime text 3,查资料总结了一下常用的设置,记录下以备用,同时也希望能改大家带来方便 0.使用package control安装,点前边超链接,复制左侧代码到console,回 ...

  6. HDU1009

    题意:有n个房子,每个房子里都有老鼠喜欢吃的咖啡豆J[i],但是每个房子都有猫看守,老鼠现在手上有M的猫粮.可以用猫粮换咖啡豆,每只猫都有猫粮的要求F[i].老鼠得到的咖啡豆是J[i]*a%     ...

  7. swoole 异步队列

    安装步骤如下(推荐把安装文件下载到 /usr/local/src 目录下): step 1: wget --no-check-certificate https://github.com/swoole ...

  8. Android--获取短信的内容,截取短信

    1.首先我们要写一个广播接收器,当我们的手机收到短信时,系统会自动发送一个广播,我们只需要接收到这条广播就可以了 2.在广播里面,我们重写的onReceive()方法,通过里面的Intent写到的Bu ...

  9. Ubuntu14.04 Objective-C hello world

    1. Install GNUstep sudo apt-get install gnustep gnustep-devel 2. Write hello world program, and save ...

  10. 关于Filezilla是否支持sftp

    我们知道filezilla是一个开源的ftp的解决方案,它提供了客户端和服务器端,支持的fpt, sftp, ftps,这是你可以从wiki中看到的关于filezilla的介绍,但是这里需要澄清一点就 ...