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 ...
随机推荐
- hdu 4908(思路题)
BestCoder Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- CCCC L1-039. 古风排版【图形输出/循环控制行列/模拟/细节】
L1-039. 古风排版 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 中国的古人写文字,是从右向左竖向排版的.本题就请你编写 ...
- Codeforces Round #464 (Div. 2) B. Hamster Farm[盒子装仓鼠/余数]
B. Hamster Farm time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- iptables 一些有用的规则
-A INPUT -i lo -j ACCEPT #允许本机内部访问,即回环 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #允许 ...
- shell中eval的使用问题
转载:http://www.blogjava.net/jasmine214--love/archive/2010/11/26/339106.html 本文将会讲解一些linux中命令的使用与技巧希望对 ...
- [笔记]Android 源码编译
问题: 解决方法: 下载地址ftp://ftp.gnu.org/gnu/make/make3.8.2的安装步骤:tar -zxvf make3.8.2.tar.gz在make-3.8.2目录下./co ...
- VS2010 C#调用C++ DLL文件 【转】
http://www.soaspx.com/dotnet/csharp/csharp_20110406_7469.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第 ...
- 客户推广微信小程序的几种方法如下
一.店面二维码推广 1.店铺门口张贴 2.餐桌.柜台张贴 3.展架.海报宣传展示 二.结合促销活动,宣传单页上印小程序二维码线下派发 三.餐厅送餐时附带点餐小卡片,印小程序二维码 四.首次扫码立送积分 ...
- vue2.0 仿手机新闻站(六)详情页制作
1.结构 2.配置详情页路由 router.config.js /** * 配置 路由 */ // 导入组件 import Home from './components/Home.vue' impo ...
- ext tree展开时的一些技巧
加入子节点的时候.我们须要展开父节点.并选中刚加入好的节点. 这时候会有一个问题. 我用的ext-js-4.2起码有一种问题. 节点内部会混乱.要么多加一个. 要么层级会发生故障. 随后我发现一个窍门 ...