依据传奇游戏服务器源码总结了一下服务器开发中比较关心的一些问题。

(1)线程之间的共享数据如何同步

CIntLock封装了临界区管理,包含了Lock()和Unlock()两个操作函数,所有

需要同步的类都从CIntLock派生,例如:CWHQueue,CDBManager,CGlobalUserList,CUserInfo,CPlayerObject

(2)数据库是如何管理和连接的

数据库服务器DBSvr采用ODBC进行数据库连接,CConnection,CDatabase,CRecordset,CDBManager等类实现对数据库的管理,这几个类

对ODBC SDK进行了封装。

DBSvr.cpp:数据库连接采用一次连接多次使用的方式,在应用程序初始化函数InitInstance中,

GetDBManager()->Init( InsertLogMsg, szDatabase, "sa", "prg" );

进行数据库的连接。

(3)玩家处理线程ProcessUserHuman主要完成什么工作

GameSvr\ProcessUserHuman.cpp

ProcessUserHuman线程主要负责处理玩家的游戏动作以及数据的发送

pUserInfo->Operate(); // 执行玩家游戏动作

pGateInfo->xSend(); // 发送数据

(4)数据如何发送

在AcceptEx接受连接后,将套接字发送缓冲设置为0,

int zero = 0;

setsockopt(pGateInfo->sock, SOL_SOCKET, SO_SNDBUF, (char *)&zero, sizeof(zero) );

需要发送的数据通过m_pUserInfo->m_pGateInfo->m_xSendBuffQ.PushQ((BYTE *)lpSendBuff);

放入发送队列。由ProcessUserHuman线程中循环调用pGateInfo->xSend();进行发送。

因为发送缓冲已设置为0,那么接下去在pGateInfo->xSend()中调用WSASend将被阻塞,ProcessUserHuman线程中调用所有pGateInfo的xSend(), 数据将被顺序发送出去。

(5)CGateInfo有什么作用,对象是在哪里分配的

CGateInfo用于管理数据收发,包含于CUserInfo对象中。

GameSvr\SockMsg_GateComm.cpp

AcceptThread中分配CGateInfo对象,并加入到全局列表中

CGateInfo* pGateInfo = new CGateInfo;

if (pGateInfo)

{

pGateInfo->m_sock = Accept;

CreateIoCompletionPort((HANDLE)pGateInfo->m_sock, g_hIOCP, (DWORD)pGateInfo, 0);

if (g_xGateList.AddNewNode(pGateInfo))

......

(6)CUserInfo有什么作用,对象在哪里分配

CUserInfo是非常重要的一个类,用于管理玩家信息,包含了

CPlayerObject* m_pxPlayerObject;

CGateInfo* m_pGateInfo;

Operate();

等重要变量与函数。

对于GameSvr:

GameSvr\GateInfo.cpp

CGateInfo::OpenNewUser中,

取出g_xUserInfoArr中空闲的CUserInfo对象加入到g_xLoginOutUserInfo列表中,然后对pUserInfo进行赋值

pUserInfo->Lock();

pUserInfo->m_sock = lpMsgHeader->nSocket;

pUserInfo->m_pxPlayerObject = NULL;

pUserInfo->m_pGateInfo = this;

pUserInfo->Unlock();

对于LoginSvr:

CGateInfo有个变量CWHList xUserInfoList;

CGateInfo::ReceiveOpenUser中分配CUserInfo对象,xUserInfoList.AddNewNode加入到xUserInfoList列表中

GameSvr与LoginSvr分配CUserInfo对象的方式的不同,其根本原因在于LoginSvr只在登录过程中使用CUserInfo,

不像GameSvr一样需要在整个游戏中时间使用CUserInfo对象。

(7)在何处投递收数据操作

GameSvr\SockMsg_GateComm.cpp

在AcceptThread线程中,接受一个连接后,pGateInfo->Recv();投递异步收数据操作

收缓冲位于:pGateInfo->OverlappedEx[0]中

工作线程ServerWorkerThread中,在收到数据并处理完成后继续投递异步收数据操作

(8)收数据完成后的处理

GameSvr\SockMsg_GateComm.cpp

工作线程ServerWorkerThread中,

if (lpOverlapped->nOvFlag == OVERLAPPED_RECV)

{

....

// 修改缓冲区数据实体的大小

pGateInfo->OverlappedEx[0].bufLen += dwBytesTransferred;

// 循环判断是不是完整的包

while ( pGateInfo->HasCompletionPacket() )

{

// 解包操作...

(9)判断是否收到了完整的包

CGateInfo::HasCompletionPacket中,缓冲区收到的数据长度>=包头固定长度+包头中指明的数据区长度,就

认为收到了完整的包。

(10)如何进行解包操作

char * CGateInfo::ExtractPacket( char *pPacket )

{

// 包大小=包头大小+数据区大小

int packetLen = sizeof( _TMSGHEADER ) + ((_LPTMSGHEADER) &OverlappedEx[0].Buffer)->nLength;

// 把完整的包复制到pPacket中

memcpy( pPacket, OverlappedEx[0].Buffer, packetLen );

// 把完整的包后面的数据移到缓冲区头部(解决粘包的问题)

memmove( OverlappedEx[0].Buffer, OverlappedEx[0].Buffer + packetLen, DATA_BUFSIZE - packetLen );

// 修改缓冲区数据大小

OverlappedEx[0].bufLen -= packetLen;

return pPacket + packetLen;

}

(11)如何处理玩家游戏数据

在ServerWorkerThread中解包操作完成后,如果数据类型是GM_DATA类型,调用pUserInfo->ProcessUserMessage

处理玩家游戏数据,调用m_pxPlayerObject->AddProcess,在AddProcess中分配PROCESSMSG对象,并将数据复制到

该对象中,然后Push到m_ProcessQ队列中待处理。ProcessUserHuman线程中遍历列表中的所有用户,调用

pUserInfo->Operate(),在CPlayerObject::Operate中从m_ProcessQ中Pop出游戏动作进行处理。

python 传奇服务端_传奇游戏服务器源码学习相关推荐

  1. 传奇游戏服务器源码学习

    依据传奇游戏服务器源码总结了一下服务器开发中比较关心的一些问题. (1)线程之间的共享数据如何同步 CIntLock封装了临界区管理,包含了Lock()和Unlock()两个操作函数,所有 需要同步的 ...

  2. php泡点,传奇泡点功能详解_无忧网络网游技术资源网_传奇服务端_传奇版本下载 - www.5uwl.net...

    泡点功能: 可以实现人物在线时间隔指定时间自动得到指定点数,这些点数可以用来换取物品.经验.等级或其它. 实现方法: 泡点是基于地图的,可以指定那些地图可以有泡点功能,人物进入此地图后就会自动增加点数 ...

  3. 传奇服务端结构传奇服务端结构

    传奇服务端结构传奇服务端结构: MirServer(传奇服务端)  ├Client(传奇私服客户端补丁,直接覆盖原客户端)  ├Documents(说明文件)  ├GameLog(游戏物品日志)  │ ...

  4. 游戏交流社区BBS论坛APP客户端和网页服务端设计 毕业论文+前后端源码及数据库文件

    下载地址:https://download.csdn.net/download/m0_63680064/36065411 项目介绍: 游戏交流社区BBS论坛APP客户端和网页服务端设计 毕业论文+前后 ...

  5. lua文件服务器,lua游戏服务器源码

    lua游戏服务器源码 内容精选 换一换 简要介绍Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.语言:C一 ...

  6. netty 游戏服务器 项目,netty游戏服务器源码

    netty游戏服务器源码 内容精选 换一换 简要介绍KBEngine是一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互, 使用KBEngine插件能够快速与(Unity3D. ...

  7. java客户端带证书访问服务端_客户端与服务器SSL双向认证(客户端:java-服务端:java)...

    客户端与服务器SSL双向认证(java-java):含源码 (一)实现技术: JSSE(Java Security Socket Extension) 是Sun为了解决在Internet上的实现安全信 ...

  8. 红叶倾城一键网页游戏服务端+客户端(无须安装Java)源码

    倾城的一键安装版服务端(包括客户端) , 无须安装Java,直接启动服务端就可进入游戏!!! 新开服添加首个GM的方法: 注册帐号并登陆游戏创建角色名称后,再服务端控制台中输入gmGrade 玩家角色 ...

  9. 从零开始开发IM(即时通讯)服务端(一)附源码

    前言 首先讲讲IM(即时通讯)技术可以用来做什么: 聊天:qq.微信 直播:斗鱼直播.抖音 实时位置共享.游戏多人互动等等 可以说几乎所有高实时性的应用场景都需要用到IM技术. 本篇将带大家从零开始搭 ...

最新文章

  1. SQLServer On Linux Package List on CentOS
  2. SAP Spartacus 事件服务 Event Service 使用介绍
  3. 敏捷开发框架_力软敏捷开发框架,不需要程序员也能做的开发工具
  4. 清理注册表后导致Oracle listener起不来
  5. [渝粤教育] 西南科技大学 刑法学 在线考试复习资料(1)
  6. 列表查询组件代码, 简化拼接条件SQL语句的麻烦
  7. scrapy vs requests+beautifulsoup
  8. pycharm设置python环境_pycharm怎么配置python环境
  9. IEEE论文投稿模板大全
  10. windows10强制删除文件_360都删除不了顽固文件?别慌,不足1M的工具帮你强制清理...
  11. 计算机桌面出现临时文件,tmp什么文件,为什么出现tmp文件
  12. 江苏省等保测评机构项目测评收费价格标准参考
  13. 宠物食品“味及”完成数百万天使轮+融资
  14. HDLBits学习笔记——状态机(中)
  15. drf第三讲——筛选、视图
  16. Origami Airplanes Folds In 3D:非常给力的3D折纸应用
  17. 【目标检测】YOLOv5能识别英雄和小兵?原理解析~
  18. 中国网民对阿里巴巴的外资大股东感到愤懑
  19. android中PreferenceScreen类的用法
  20. Postman设置中文

热门文章

  1. Bootstrap 模态框(Modal)
  2. Mybatis(持久层的框架),注入的三种方式
  3. USTB自习教室查询系统-项目计划书-第二部分
  4. 警察与小偷的实现之中的一个client与服务端通信
  5. 如何区分Babel中的stage-0,stage-1,stage-2以及stage-3(转)
  6. python 编码报错问题 'ascii' codec can't encode characters 解决方法
  7. Android系统Recovery工作原理之使用update.zip升级过程分析(一)
  8. Sharepoint学习笔记—ECM系列--从.CSV文件导入术语集(Term Sets)
  9. Web Control开发随笔(4):Control与WebControl 的Properity初探
  10. 5. linux操作系统bios启动过程需要执行哪几个操作?,Linux系统启动的大致过程