一个包的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 < )//根据长度判断从哪种共享内存中取
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流程的更多相关文章
- 一个包的libevent流程
//一个发包的流程 第一个包就是客户端的心跳包,现在加了版本的包 再来看看这个发包打包过程,过程坚持,但理解费劲 void NGP::OnliveTimer()//客户端心跳,5s发一次 { Send ...
- python基础之打/解包及运算符与控制流程
python基础之打/解包及运算符与控制流程 python中的解压缩(即序列类型的打包和解包) python提供了两个设计元祖和其他序列类型的处理的便利,也就是自动打包与自动解包功能,比如: data ...
- 判断一个Activity 判断一个包 是否存在于系统中 的方法
判断一个包是否存在于系统中(来自网络),经过测试,好用: public boolean checkBrowser(String packageName) { if (packageName == nu ...
- python高级编程 编写一个包1
#目的是:编写,发行python包可重复过程"""1:是缩短开始真正工作之前所需要的设置时间,也就是提供模板2:提供编写包的标准化方法3:简化测试驱动开发方法的使用4:为 ...
- Android系统,动态找出一个包下所有的类
最近在写一个android应用,由于针对不同机型功能很不同,为了隔离变化,希望将各项功能插件化,通过编译开关来控制不同版本的功能,而不是在代码中通过逻辑来判断. 我想了一个办法,用表驱动的方法,结合插 ...
- SSIS从理论到实战,再到应用(1)----创建自己的第一个包
原文:SSIS从理论到实战,再到应用(1)----创建自己的第一个包 其实,如果你使用sql2008的导出导入工具的时候,你就已经在使用包了. 目标:使用sql2008 导入导出工具,导入excel数 ...
- npm 是node.js下带的一个包管理工具
npm 是node.js下带的一个包管理工具 npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...
- debian系统的另一个包管理器aptitude
最近在玩OPI的时候遇到了一个包因为各种依赖问题死活装不上.苦搜很久找到这个aptitude包管理器. 基于debain衍生的各种操作系统比较常用包管理器是apt,不过apt在遇到依赖问题的时候处理得 ...
- Android--------从一个包中的Avtivity创建另外另外一个包的Context
Android中有Context的概念,想必大家都知道.Context可以做很多事情,打开activity.发送广播.打开本包下文件夹和数据库.获取classLoader.获取资源等等.如果我们得到了 ...
随机推荐
- 在c#中使用mongo-csharp-driver操作mongodb
1)下载安装 下载地址:http://github.com/mongodb/mongo-csharp-driver/downloads 编译之后得到两个dll MongoDB.Driver.dll:顾 ...
- windows服务器记录3389远程桌面IP策略
以下代码复制存成一个批处理文件后双击即可! 3389IP日志路径是C:\WINDOWS\PDPLOG\RDPlog.txt 代码: MD C:\WINDOWS\PDPLOG " /f ...
- PHP变量作用域以及地址引用问题
作用域的概念: 在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围.这个可以访问的范围称为作用域. 主要的常用的包括:局部变量.全局变量.静态变量. 1.局部变量:就是 ...
- Python-Day12 Python mysql and ORM
一.Mysql数据库 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据 ...
- Ruby实现wordCounter
做解密发现的: m={} File.open("test1.txt") do |f| f.each_line do |line| line.chomp! #去除每行结尾的回车(\n ...
- 《Prism 5.0源码走读》Bootstrapper
Prism框架需要在应用程序启动的时候进行一些初始化的工作,Bootstrapper就是来做这些的,是其切入点. Bootstrapper主要要做的事有:创建和配置module catalog,创建D ...
- java reflect 初始学习 动态加载类
首先要理解Class类: 在java 的反射中,Class.forName("com.lilin.Office") 使用类的全名,这样获取,不仅仅表示了类的类类型,同时还代表着类的 ...
- 使用Handler和Timer+Timertask实现简单的图片轮播
布局文件就只放了一个简单的ImageView,就不展示了. 下面是Activity package com.example.administrator.handlerthreadmessagedemo ...
- hdu 5166 Missing number
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5166 Missing number Description There is a permutatio ...
- 如何配置DNS服务器(局域网——域名指向某个IP地址)
单击“开始”,指向“管理工具”,然后单击“DNS”,打开 DNS 管理器. 如有必要,向管理单元添加适用的服务器,然后连接该服务器.在控制台树中,单击适用的 DNS 服务器. 在“操作”菜单上 ...