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项目 ...
随机推荐
- asp.net购物车,订单以及模拟支付宝支付(四)---模拟支付宝支付
下完订单之后到支付宝付款,成功之后再返回来修改订单状态.由于只是测试,所以就没有真正的连接到支付宝,用的是一个模拟支付宝的程序 下载地址:支付宝模拟程序 这是一个vs2010的项目,本来网上找了一个模 ...
- jsp中URL传递中文參数的处理
在页面的url中使用encodeURI(encodeURI(中文)).对中文进行编码.并在server的java程序中使用URLDecoder.decode(中文, "UTF-8" ...
- Android 完美退出 App 方法
大家都知道 Android 的 Activity 是存着历史栈的,比如从 A -> B -> C,C 完成 finish 后回到 B,把所有的Activity 都 finish了,程序就自 ...
- 内核中bitmap的使用
在编写应用层代码中使用位图,发现内核中已经有现成的实现便使用之.对位图的使用主要是几个 关键API. 第一:bitmap_zero函数用于初始化位图 源码如下: /* *@dst: 位图的起始地址 * ...
- iOS学习笔记之蓝牙(有关蓝牙设备mac地址处理)
原文: http://blog.sina.com.cn/s/blog_6f2f0bed0102xn0e.html
- Gizmos 辅助线框
Gizmos are used to give visual debugging or setup aids in the scene view. Gizmos是用于在场景视图可视化调试或辅助设置. ...
- handlebars.js基础学习笔记
最近在帮学校做个课程网站,就有人推荐用jquery+ajax+handlebars做网站前端,刚接触发现挺高大上的,于是就把一些基础学习笔记记录下来啦. 1.引用文件: jquery.js文件下载:h ...
- trac 的安装设置
Trac的安装设置 原网页:http://wiki.ubuntu.org.cn/Trac%E7%9A%84%E5%AE%89%E8%A3%85%E8%AE%BE%E7%BD%AE 出自Ubuntu中文 ...
- 我们常用的在a标签中有点击事件
我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题 ...
- PHP框架认识初步
PHP框架比較 CodeIgniter Codeigniter 相当轻量级.下载下来就能用, CI 的最大特点就是可扩展性非常强 你能够通过不改动源代码的方式 优雅的扩展差点儿全部的东西. think ...