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之间通信的更多相关文章

  1. 【转】wpa_supplicant与wpa_cli之间通信过程

    [转]wpa_supplicant与wpa_cli之间通信过程 转自:http://blog.chinaunix.net/uid-26585427-id-4051479.html wpa_suppli ...

  2. 【linux】mkfifo 命令创建命名管道实现进程之间通信

    mkfifo 命令 mkfifo命令创建一个FIFO特殊文件,是一个命名管道(可以用来做进程之间通信的桥梁) 管道也是一种文件,一般是linux中的一个页大小,4k,管道数据一旦被读取就没了.(管道大 ...

  3. 客户端与服务器之间通信收不到信息——readLine()

    写服务器端和客户端之间通信,结果一直读取不到信息,在https://blog.csdn.net/yiluxiangqian7715/article/details/50173573 上找到了原因:使用 ...

  4. 【Vue课堂】Vue.js 父子组件之间通信的十种方式

    这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...

  5. VLAN之间通信-三层交换

    实验目的 VLAN之间通信-三层交换 掌握配置VLANIF接口的方法 理解数据包跨VLAN路由的原理 掌握测试多层交换网络连通性的方法 实验原理 三层交换机在原有二层交换机的基础之上增加了路由功能,同 ...

  6. 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信

    官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...

  7. iframe之间通信问题及iframe自适应高度问题

    下面本人来谈谈iframe之间通信问题及iframe自适应高度问题. 1. iframe通信 分为:同域通信 和 跨域通信.所谓同域通信是指 http://localhost/demo/iframe/ ...

  8. (六)ROS话题---节点之间通信的方式

    1. 理解 ROS 话题: (Ctrl+Alt+T 打开一个新终端) 运行下面的命令: $ roscore (Ctrl+Alt+T 打开一个新终端) $ rosrun turtlesim turtle ...

  9. vue组件之间通信传值

    原文链接:https://blog.csdn.net/lander_xiong/article/details/79018737 我认为这位博主的这篇文章写的非常详细,通俗易懂, 我们这次的vue项目 ...

随机推荐

  1. 2016summer 训练第二场

    1.http://acm.hdu.edu.cn/showproblem.php?pid=5112 #define _CRT_SECURE_NO_DEPRECATE #include<iostre ...

  2. Python命令行参数学习

    man python 查看python的帮助文件 命令行参数:       -B     Don't write .py[co] files on import.              See a ...

  3. ISP模块之彩色图像增强--ACE算法 .

    ACE(Automatic Color Enhancement),自动色彩增强算法,是一种对于彩色图像增强十分行之有效的方法.它的改进算法以及快速实现在文章Automatic Color Enhanc ...

  4. fabricjs line

    let line1 = new fabric.Line([lineleft, lineheight, lineleft, 0], {//终止位置,线长,起始位置,top,这里是从项目中截下来的我用了变 ...

  5. 一扫天下——ZXing使用全解析

    一扫天下--ZXing使用全解析 二维码如今已经烂App了,无论什么App.没有二维码就好像低人一等了. 所以,在自己的项目中集成二维码功能还是非常有必要的. 网上非常多都是基于ZXing2.3的.可 ...

  6. red5截屏

    在red5-web.xml添加 <bean id="rtmpSampleAccess" class="org.red5.server.stream.RtmpSamp ...

  7. JDK与adb/android环境变量配置完整教程

    在这篇文章中.主要解决一个在Java或者Android开发中第一步须要解决的问题,那就是环境变量的配置.因为这部分在网上有非常多教程.參差不齐.我这里主要是对JDK与adb/android两者的环境变 ...

  8. iOS项目开发之实现无限轮播

    简介 分析 实现 代码下载 一.简介 在实际的开发当中,会经常有界面需要实现图片的无限轮播这样的需求.比如新闻app,或者其他app的广告位 实现的方式有很多种,最先想动的一定是scrollView, ...

  9. DbVisualizer出现下列错误:Could not read XML file

    数据库连接工具对于我们软件测试工程师来说是日常的工具,一旦关键时刻报些莫名的错误,相信大家很是苦恼.当然,各公司数据库连接工具各异,像DbVisualizer.PLsql.sqldeveloper.T ...

  10. 【SpringMVC学习11】SpringMVC中的拦截器

    Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...