GS发包到MS(GS,MS包交互过程)
例:人物上线
首先看看其实如何确定是哪张地图的
数据库首先只保存一个mapid
在share初始化的时候已经初始化了所有map,并保存了map的指针信息,其key就是mapid
if(rActorEx.GetMapID() <= )
rActorEx.SetMapID();
int mapID = rActorEx.GetMapID();
rActorEx.m_nBodyID = m_pShare->TGetnBodyId(rActorEx.GetProf(), rActorEx.GetSex());//现在那个bodyid用到了 m_pMap = m_pShare->GetMapByMapId(mapID);//通过mapid就能获得map指针信息
if(!m_pMap)
{
m_ActorId = ;
return;
} m_pMap->Gs2MsData(gs2ms_add_player, m_nChannelId, (void*)&rActorEx, sizeof(rActorEx));//传入MS,m_pMap即玩家所在地图指针
void Map::Gs2MsData(int cmd, int channel_id, void* data, int len)
{
MapPkt pkt;
pkt.channelId = channel_id;
pkt.data = m_memPool.popPkt(len);//从内存池中分配一块内存出来,以前用的new,然后这个new很容易失败的
memcpy(pkt.data, data, len);
pkt.len = len;
pkt.cmd = cmd; PushPkt(pkt);
}
//接下来就是起的线程的作用了
void ThrTransData::PushPkt(MapPkt Pkt)
{
#ifdef BOOST_LOCKFREE
for (;;)
{
if(m_gs2msPkts2.push(Pkt))//将这个包放入无锁队列中
break;
cxx11::this_thread::interruptible_wait();
}
#else
{
cxx11::lock_guard lock(m_mtxGs2Ms);
m_queGs2MsPkts.push(Pkt);
}
#endif
}; void ThrTransData::ThreadLoop()
{
//SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
MapPkt Pkt;
try
{
int nCount = ;
while (true)
{
if(GetDataFromQueue(&Pkt))//从无锁队列中取包
{
ProcessPkt(Pkt);
m_memPool.pushPkt(Pkt.data, Pkt.len); nCount++;
if(nCount > )
{
nCount = ;
m_spTimerFactory->driveTimer();
}
continue;
}
{
m_spTimerFactory->driveTimer();
if (m_bStopWork)
break;
cxx11::this_thread::interruptible_wait();
}
}
}
catch(...)
{
char szMsg[] = {};
sprintf(szMsg, "【%s】线程%dMap :Pkt.cmd = %d",
__FUNCTION__, ::GetCurrentThreadId(), Pkt.cmd);
safe::error_msg(szMsg);
}
} void Map::ProcessPkt(MapPkt pkt)
{
//...
//gs2ms_add_player属于GS与MS通信的内部协议,内部协议采用树的形式,平行关系就太多了管理不方便
else if(gs2ms_add_player == pkt.cmd)//玩家进入地图消息,仅仅是个小例子
{
PlayerChannel* pPC = new PlayerChannel(this);//这个PlayerChannel是很大的一个模块,玩家信息,回头再看
//加到地图中,但是并未激活该玩家
int nChannelId = pPC->OnPlayerEnter(pkt.data, pkt.len);
m_vecPlayerChannel[nChannelId] = pPC;
AddPlayer(nChannelId);
}
//...
}

GS发包到MS的更多相关文章

  1. 客户端发包 GS端接收

    客户端发包,GS接收 bool GameServer::ProcessLoop(packet& rPkt)//GS线程做的 { if(false == m_spDataLayer->Re ...

  2. 项目分析(map复习)

    有段时间没看map里面的东西了,刚才看发现功能上增加了一些,在来复习了一次流程初始化每个map建立线程,这个线程有两个功能,1.处理GS发过来的包 2.驱动map里面的定时器GS发过来的包是存在m_g ...

  3. SNMP的工作原理&软件开发

    SNMP(Simple Network Management Protocol,简单网络管理协议)首先是由IETF的研究小组为了解决Internet上的路由器管理问题而提出的.SNMP的设计原则是简单 ...

  4. GZip压缩与解压缩

    GZIP的压缩与解压缩代码: public static class CompressionHelper { /// <summary> /// Compress the byte[] / ...

  5. 移动App服务端架构设计

      我从事手机app服务端开发现在已经是3个年头,自己也整理出了一套相对好用的服务架构,写出来,跟大家一起分享.如有不足,还请多指教. 一:基础流程图. 其实有一点还需要加上,就是对json的压缩和加 ...

  6. GS与MS之间通信

    GS与MS之间通信 注意GS与MS是两个线程,现在是每个map一个线程,他们之间是内部协议进行通信的,那既然是两个线程那如何通信呢,看了net进程通信这个就比较简单了 举个例子 m_pMap-> ...

  7. GS给客户单发包以及m_queGcWait(所有GC共享)

    GS给客户单发包以及m_queGcWait(所有GC共享) send_stat BaseChannel::SendCmd(int nCmd, void* pData, int nLen) { Prot ...

  8. share(发包方面)

    share(发包方面) 接收所有map发过来的包,这个是GS线程驱动的 { for (;;) { //... if(!itMap.second->RecvData(Pkt)) break; if ...

  9. GS与数据库打交道

    GS与数据库打交道 link_stat stat = (link_stat)rPkt.size; if (stat == link_stat::link_connected) { GameChanne ...

随机推荐

  1. java使用DBCP连接池创建工具类

    1.说明 java中有个扩展包 javax下面有个DataResource的接口  javax.sql.DataResource 该接口定义了连接池的方法规范 而DBCP框架有apache公司开发,他 ...

  2. 【转载】Outlook2010 移动数据文件到其它地方

            您可以将数据文件移到计算机的其他文件夹中.移动文件的一个原因在于可使备份更容易并且可以让默认的outlook邮件文件不在存在C盘,导致装系统不见或者文件过大而撑死了C盘.例如,如果数据 ...

  3. 某考试 T1 monopoly

    可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...

  4. - > 动规讲解基础讲解六——编辑距离问题

    给定两个字符串S和T,对于T我们允许三种操作: (1) 在任意位置添加任意字符(2) 删除存在的任意字符(3) 修改任意字符 问最少操作多少次可以把字符串T变成S?  例如: S=  “ABCF”   ...

  5. my -> mysql on duplicate key update使用总结

    CREATE TABLE `t_duplicate` ( `a` int(11) NOT NULL, `b` int(255) DEFAULT NULL, `c` int(255) DEFAULT N ...

  6. Jenkins配置git进行构建失败:Error cloning remote repo 'origin'的解决思路

    说明:这个没有实际的解决方法,只提供一个思路去解决. 操作系统:windows 背景:在配置的节点之后,由于是windows的系统,运行git克隆地址,使用的是SSH协议地址.出现如下的错误: Err ...

  7. java加载类的方法1.classloader 2.class.forName()

    java加载类的方法1.classloader 2.class.forName() 加载一个类后,是在方法去创建这个类的元信息class对象,在方法区立刻创建.在方法区创建.

  8. 【IntelliJ IDEA】代码中出现Usage of API documented as @since 1.8+ more..

    在idea中写代码过程中.有这种报错出现: Usage of API documented as @since 1.8+ more.. 修改JDK版本的几个地方 最后,在pom.xml文件中添加: & ...

  9. navicat链接lunix平台上的数据库

    xsell 4.navicat软件 想在链接数据库的得常规设置里设置: 链接名称.主机名(链接lunix平台后才干ping 通的ip地址) port.username.password 然后选择ssh ...

  10. Hibernate get load的区别

    这两个函数都是用来从数据库中加载对象,其区别说起来主要有以下两点: 1.如果数据库中不存在该对象,那么load是抛出一个ObjectNotFound的异常,而get是返回一个空指针 2.加载机制不同 ...