GS与数据库打交道
GS与数据库打交道
link_stat stat = (link_stat)rPkt.size;
if (stat == link_stat::link_connected)
{
GameChannel* pNewGC = new GameChannel();
pNewGC->m_nChannelId = rPkt.channel_id;//客户端唯一标识
pNewGC->m_pDataLayer = m_spDataLayer.get();//GC直接发包到客户端
pNewGC->m_pShare = this;//我知道share是所有玩家,所有地图,但具体GameServer与Share什么关系还不清
pNewGC->m_pAsynDBC = this->m_spAsynDBC.get();//GC访问数据库 m_vecChannel[rPkt.channel_id] = pNewGC;//放到玩家通道中
m_LiveMgr.Add(rPkt.channel_id);
}
else if (stat == link_stat::link_disconnected || stat == link_stat::link_connect_failed )
{
GameChannel* pDisconnectGC = m_vecChannel[rPkt.channel_id];
if (pDisconnectGC)
{
//如果进入了地图,保存人物信息时会调用push_freeQueue + 滞空m_Channels[channel_id],
pDisconnectGC->OnDisconnect();//处理玩家下线工作,包括地图,感觉这个只是处理GS这边的 //如果未进地图就下线,直接断开;不用保存角色详细数据,可直接放入释放队列中
if (!pDisconnectGC->m_pMap)//这需要看人物下线MS怎么发包过来,处理什么事情了,没进入地图就不需要等MS发数据过来然后GS保存
{
AutoFreeGC(pDisconnectGC);//释放GC,这个需要没有数据库返回才去释放
}
}
m_LiveMgr.Remove(rPkt.channel_id);
} bool GameChannel::OnReceiveData(void* pData, int nLen)
{
if (!BaseChannel::OnReceiveData(pData, nLen))//感觉在BC里面处理那些最基本的功能
{
if(m_eGameState != eGameState_EnterMap)
return false; m_pMap->Gs2MsData(gs2ms_转client_cmd, m_nChannelId, pData, nLen);
}
return true;
} bool BaseChannel::OnReceiveData(void* data, int len)
{
Protocol Ptl = {};
if(!Ptl.from_buffer(data, len))
return false; auto it = m_mapPktAnalysis.find(Ptl.cmd_type);//m_mapPktAnalysis是在GC里面绑定的,然后再BC里面回调,这种用法还真不熟
if(it == m_mapPktAnalysis.end())
return false; return it->second(Ptl.content, Ptl.size);
} 看看其是怎么访问数据库的
bool GameChannel::OnLogin(void* pData, int nLen)
{
struct UserInfo
{
int userID; //对应数据库中的_id
char userName[]; //用户名
char userPwd[]; //用户密码
}; if(m_eGameState != eGameState_OnlyConnect)
return false;
UserInfo* info = (UserInfo*)pData;
//m_fnGetUserID一个function,function就相当于函数指针,函数地址是存储在代码区里面,也是有地址的,将这个指针传到ASYNDB,然后回调这个指针,也是可以
m_pAsynDBC->GetUserID(&m_fnGetUserID ,info->userName);//这样直接放个命令到数据库,在回调,服务器不用去等待结果,这个也是比较基本的用法了,刚开始搞几天都不太理解
IncDBAsk(); m_pUserInfo = new ShuiHu::UserInfo;
strncpy(m_pUserInfo->m_szUserPwd, info->userPwd, MAX_NAME_LEN);
return true;
}
GS与数据打交道不多就是GameServer打开的时候获取道具,帮会信息,最主要的是那个m_spAsynDBC->Drive();驱动回调
//其实总结起来就是每个GC有个数据库的指针,然后每次绑定一个GC的函数,然后数据库回调,当然每个类的对象的函数都有地址空间的,对应于这个地址空间不熟
GS与数据库打交道的更多相关文章
- GS与网络打交道
与网络打交道 在GS,GC,Share都与网络打交道,但还是GC最多 GC打交道过程 send_stat BaseChannel::SendCmdTry() { if (!m_queCmd.size( ...
- 【程序员技术练级】学习一门脚本语言 python(三)跟数据库打交道
接着上一篇,该篇讲述使用python对数据库进行基本的CRUD操作,这边以sqlite3为例子,进行说明.sqlite3 是一个非常轻型的数据库,安装和使用它是非常简单的,这边就不进行讲述了. 在py ...
- 再看GS接包过程
再看GS接包过程 bool GameServer::ProcessLoop(packet& rPkt) { if(false == m_spDataLayer->Recv(rPkt)) ...
- Oracle 数据库SQL性能查看
作为一个开发/测试人员,或多或少都得和数据库打交道,而对数据库的操作归根到底都是SQL语句,所有操作到最后都是操作数据,那么对sql性能的掌控又成了我们工作中一件非常重要的工作.下面简单介绍下一些查看 ...
- 从C#到Objective-C,循序渐进学习苹果开发(7)--使用FMDB对Sqlite数据库进行操作
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本篇主要开始介绍基于XCod ...
- PHP访问MySql数据库介绍
在网站后台,经常要与数据库打交道.本文介绍如何使用XAMPP来管理MySql数据库及如何用PHP来访问MySql数据库. 一.使用XAMPP来管理MySql数据库 首先使用XAMPP打开MySql的管 ...
- java jdbc 连接mysql数据库 实现增删改查
好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...
- MyBatis知多少(13)MyBatis如何解决数据库的常见问题
在现代软件项目中数据库通常被认为是遗留组件.它们一直以来都被认为难以使用,不论是出于技术的还是非技术的原因.大多数软件开发人员宁可从头开始完完全全地重建一个数据库. 如果数据库是遗留下来的,相信一些开 ...
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- andorid人员文件上传服务器的搭建(tomcat中)
1.将.war文件复制到tomcat服务器webapps下,启动服务器即可 2.访问工程路径http://localhost:8080/FileUpload/index.jsp即可测试上传 3.测试成 ...
- asp.net mvc 5 利用ActionFilterAttribute实现权限过滤
关于c#属性的教程:http://www.runoob.com/csharp/csharp-attribute.html 在asp.net mvc5中,可以利用ActionFilterAttribut ...
- Codeforces 371A K-Periodic Array(模拟)
题目链接 K-Periodic Array 简单题,直接模拟即可. #include <bits/stdc++.h> using namespace std; #define REP(i, ...
- Cocos 2d-X Lua游戏开发Mac环境搭建以及一点点感悟
接触Cocos2d-x 最近由于公司项目的需要,自己开始接触Cocos,开始做一些简单的轻量级的游戏,以前没有接触过这一块的东西,也是借助这个机会学习一下游戏的开发,由于以前自己接触的全都是iOS和A ...
- JSP-Servlet-SpringMVC
作者:码思客链接:https://zhuanlan.zhihu.com/p/37612412来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本篇文章,我们来讲讲技术,系 ...
- android 内存泄漏出现的情况
非静态内部类的静态实例由于内部类默认持有外部类的引用,而静态实例属于类.所以,当外部类被销毁时,内部类仍然持有外部类的引用,致使外部类无法被GC回收.因此造成内存泄露. 类的静态变量持有大数据对象静态 ...
- python的依赖性安全性检查
1.safety 安装: pip install safety 使用: 检查整个系统的依赖包安全性safety check检查某个项目的依赖性安全safety check -r requirement ...
- VS2010 MFC中 单独添加ODBC数据库记录集类(CRecordset)方法
基于VS2010 MFC的项目是之前建好的,后来需要添加数据库. 方法分享于此. 1. 打开自己的项目,项目->添加类. 2. 选MFC ODBC使用者,点右下角的添加. 3. 点数据源. / ...
- Hadoop Mapreduce分区、分组、二次排序过程详解
转载:http://blog.tianya.cn/m/post.jsp?postId=53271442 1.MapReduce中数据流动 (1)最简单的过程: map - reduce (2)定制了 ...
- Linux命令之basename 命令
用途 返回一个字符串参数的基本文件名称. 语法 basename String [ Suffix ] 描述 basename 命令读取 String 参数,删除以 /(斜杠) 结尾的前缀以及任 ...