GS与MS之间通信
GS与MS之间通信
注意GS与MS是两个线程,现在是每个map一个线程,他们之间是内部协议进行通信的,那既然是两个线程那如何通信呢,看了net进程通信这个就比较简单了
举个例子
m_pMap->Gs2MsData(gs2ms_add_player, m_nChannelId, (void*)&rActorEx, sizeof(rActorEx));//发送玩家上线包
void Map::Gs2MsData(int cmd, int channel_id, void* data, int len)
{
MapPkt pkt;
pkt.channelId = channel_id;
pkt.data = m_memPool.popPkt(len);注意这个m_memPool是线程安全的队列,内部是boost无锁队列实现的
memcpy(pkt.data, data, len);//不同线程需要内存拷贝,不可能使用同一块地址
pkt.len = len;
pkt.cmd = cmd; PushPkt(pkt);
} void ThrTransData::PushPkt(MapPkt Pkt)
{
for (;;)
{
if(m_gs2msPkts2.push(Pkt))//将包放入boost无锁队列中
break;
cxx11::this_thread::interruptible_wait();
}
}
那看看MS这边是如何取的
在share初始化的时候开启了一个线程,这个线程可以说整个map的数据都是这里面处理的
bool ThrTransData::GetDataFromQueue(MapPkt* pPkt)
{
if(m_gs2msPkts2.empty())
return false;
{
MapPkt tmpPkt;
if(m_gs2msPkts2.pop(tmpPkt))//从GS到MS这端的无锁队列中取包
{
*pPkt = tmpPkt;
return true;
}
return false;
}
return true;
}
if(GetDataFromQueue(&Pkt))
{
ProcessPkt(Pkt);//解析包调用相应函数
m_memPool.pushPkt(Pkt.data, Pkt.len);//将内存池归还 nCount++;
if(nCount > )
{
nCount = ;
m_spTimerFactory->driveTimer();
}
continue;
}
//至此从GS到MS这边的包就是这样处理的 那从MS到GS的包
从Map需要发到GS的包也不多,还有一种通过GS转到map的
SendCmd2Gs(ms2gs_prop_mgr, nChannelID, pData, nLen);
void SendCmd2Gs(int nCmd, int nChannelId, void* pData, int nLen)
{
MapPkt Pkt;
Pkt.cmd = nCmd;
Pkt.channelId = nChannelId;
char* pszNewBuffer = new char[nLen];//这个是自己new的,发送到MS是从内存池中获取的
memcpy(pszNewBuffer, pData, nLen);
Pkt.data = pszNewBuffer;
Pkt.len = nLen;
PushData2GS(Pkt);
}; void PushData2GS(const MapPkt& Pkt)
{
while()
{
if(m_quePkts2Gs.push(Pkt))//从MS发送到GS的队列
}
}
那GS是如何去的呢
void Share::ProcMapSendData()//这个是GS驱动的
{
if(!itMap.second->RecvData(Pkt))//从无锁队列中取包
break;
if(Pkt.cmd == ms2gs_转client_cmd)//针对包进行处理
{
OnTurnToClient(Pkt.channelId, Pkt.data, Pkt.len);
}
}
//开来发包都是双向的,需要两个队列,这个在net那边也是的
//其次就是需要额外的内存放到队列中,因为不可能去操作同一块内存的,要么自己new,要么从内存池中分配
//MS与GS之间通过MapPkt进行通信,对于客户端和服务器通过protocol通信,通常是自己定义一块buf,然后打包到BUF中,net那块也是在内存池中分配一块然后存储这个buf,因为这个buf也是公用的
//刚开始不懂程序就是这些内存问题没有搞清楚
GS与MS之间通信的更多相关文章
- 【转】wpa_supplicant与wpa_cli之间通信过程
[转]wpa_supplicant与wpa_cli之间通信过程 转自:http://blog.chinaunix.net/uid-26585427-id-4051479.html wpa_suppli ...
- 【linux】mkfifo 命令创建命名管道实现进程之间通信
mkfifo 命令 mkfifo命令创建一个FIFO特殊文件,是一个命名管道(可以用来做进程之间通信的桥梁) 管道也是一种文件,一般是linux中的一个页大小,4k,管道数据一旦被读取就没了.(管道大 ...
- 客户端与服务器之间通信收不到信息——readLine()
写服务器端和客户端之间通信,结果一直读取不到信息,在https://blog.csdn.net/yiluxiangqian7715/article/details/50173573 上找到了原因:使用 ...
- 【Vue课堂】Vue.js 父子组件之间通信的十种方式
这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...
- VLAN之间通信-三层交换
实验目的 VLAN之间通信-三层交换 掌握配置VLANIF接口的方法 理解数据包跨VLAN路由的原理 掌握测试多层交换网络连通性的方法 实验原理 三层交换机在原有二层交换机的基础之上增加了路由功能,同 ...
- 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信
官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...
- iframe之间通信问题及iframe自适应高度问题
下面本人来谈谈iframe之间通信问题及iframe自适应高度问题. 1. iframe通信 分为:同域通信 和 跨域通信.所谓同域通信是指 http://localhost/demo/iframe/ ...
- (六)ROS话题---节点之间通信的方式
1. 理解 ROS 话题: (Ctrl+Alt+T 打开一个新终端) 运行下面的命令: $ roscore (Ctrl+Alt+T 打开一个新终端) $ rosrun turtlesim turtle ...
- vue组件之间通信传值
原文链接:https://blog.csdn.net/lander_xiong/article/details/79018737 我认为这位博主的这篇文章写的非常详细,通俗易懂, 我们这次的vue项目 ...
随机推荐
- docker之人手一台服务器
安装docker uname –r 检查内核版本 yum update 升级本地yum包 vim /etc/yum.repos.d/docker.repo #添加yum仓库配置 [dockerrepo ...
- display:inline-block;在各浏览器下的问题和终极兼容办法
display:inline-block;在各浏览器下的问题和终极兼容办法 一.IE 5.5.6.7 .8(Q)中display:inline-block;失效 兼容办法: IE 5.5.6.7 .8 ...
- 【Hadoop】Hadoop MR 自定义分组 Partition机制
1.概念 2.Hadoop默认分组机制--所有的Key分到一个组,一个Reduce任务处理 3.代码示例 FlowBean package com.ares.hadoop.mr.flowgroup; ...
- zabbix_sender高效模式
1.zabbix_sender介绍 zabbix获取key值有超时时间,如果自定义的key脚本一般需要执行很长时间,这根本没法去做监控,获取数据有超时时间,如果一些数据需要执行比较长的时间才能获取的话 ...
- 倍福TwinCAT(贝福Beckhoff)基础教程2.0 TwinCAT常用快捷键
F5:运行程序 CTRL+F5:停止运行当前程序 F12:登出 F11:登录 CTRL+F7:强制写入数值 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.you ...
- Hadoop最大值的算法中出现的错误(strToDouble)
错误信息: Exception in thread "main" java.lang.NumberFormatException: For input string: " ...
- Navicat Premium 连接 Oracle 数据库
Navicat Premium 是一个可多重连接的数据库管理工具,它可让你以单一程序同時连接到 MySQL.SQLite.Oracle 及 PostgreSQL 数据库,让管理不同类型的数据库更加方便 ...
- HDU 3732 Ahui Writes Word(多重背包)
HDU 3732 Ahui Writes Word(多重背包) http://acm.hdu.edu.cn/showproblem.php? pid=3732 题意: 初始有N个物品, 每一个物品有c ...
- MATLAB 2014a 在Mac os x yosemite 10.10 Retina显示模糊的解决的方法
恐怕非常多童鞋在升级了yosemite之后都遇到了Matlab的问题. 之前转载的一篇文章写了安装的方法,本文说一下解决Retina屏显示模糊的办法. 那么因为Matlab 2014a使用自带的jav ...
- windows 下编译64位ffmpeg
window下如何编译ffmpeg 前文已有介绍,前面介绍的都是如何编译32位的库,本文主要介绍window 下如何编译64位ffmpeg库. 一.搭建编译环境 1.下载 windows下编译64位F ...