本文是通过TrinityCore研究从而对MMORPG服务器设计分析。

网络字节序

ByteBuffer是字节(unsigned char类型)处理,没有大小端处理。在网络通信应用程序上,这种是经常有的,网络是通过字节发送。

消息包格式:包头+包类型+包体

包头rc4加密

登录认证是(srp6)安全远程密码第六版协议,包类型是占一字节。

游戏中,包类型占1.5字节。

1、封包

重载&operator<<

按顺序把数据封包

2、解包

重载&operator>>

按顺序把数据解出

消息包处理

网络是采用boost asio

1、发送

这里需要注意,在这个执行,在多线程里面操作加锁

std::unique_lock<:mutex> guard(_writeLock);

boost::asio的发送函数:_socket.async_write_some

1.1 登录认证的发送

void AuthSession::SendPacket(ByteBuffer& packet)

{

if (!IsOpen())

return;

if (!packet.empty())

{

MessageBuffer buffer;

buffer.Write(packet.contents(), packet.size());

std::unique_lock<:mutex> guard(_writeLock);

QueuePacket(std::move(buffer), guard);

}

}

2.2在游戏中发送

void WorldSocket::SendPacket(WorldPacket const& packet)

{

if (!IsOpen())

return;

if (sPacketLog->CanLogPacket())

sPacketLog->LogPacket(packet, SERVER_TO_CLIENT, GetRemoteIpAddress(), GetRemotePort());

ServerPktHeader header(packet.size() + 2, packet.GetOpcode());

std::unique_lock<:mutex> guard(_writeLock);

_authCrypt.EncryptSend(header.header, header.getHeaderLength());

#ifndef TC_SOCKET_USE_IOCP

if (_writeQueue.empty() && _writeBuffer.GetRemainingSpace() >= header.getHeaderLength() + packet.size())

{

_writeBuffer.Write(header.header, header.getHeaderLength());

if (!packet.empty())

_writeBuffer.Write(packet.contents(), packet.size());

}

else

#endif

{

MessageBuffer buffer(header.getHeaderLength() + packet.size());

buffer.Write(header.header, header.getHeaderLength());

if (!packet.empty())

buffer.Write(packet.contents(), packet.size());

QueuePacket(std::move(buffer), guard);

}

}

2、接收

接收函数_socket.async_read_some

处理已收到数据包MessageBuffer& packet = GetReadBuffer();

登录认证接收处理:void WorldSocket::ReadHandler()

游戏过程处理:

void WorldSocket::ReadHandler()

bool WorldSocket::ReadHeaderHandler()

bool WorldSocket::ReadDataHandler()

流程

消息通过函数指针映射处理。

1、登录游戏

std::unordered_map const Handlers = AuthSession::InitHandlers();

2、认证通过后

void WorldSocket::HandleAuthSession(WorldPacket& recvPacket)

内部把这次玩家会话添加 :

新建一个会话_worldSession = new WorldSession(id, shared_from_this(), AccountTypes(security), expansion, mutetime, locale, recruiter, isRecruiter);

添加到世界:sWorld->AddSession(_worldSession);

判断是否有同个帐号登录,如果有,把它踢下线

2、全部会话处理:

void World::UpdateSessions(uint32 diff)

{

..

for (SessionMap::iterator itr = m_sessions.begin(), next; itr != m_sessions.end(); itr = next)

..

}

2、游戏过程中

extern OpcodeHandler opcodeTable[NUM_MSG_TYPES]

写在后面

TrinityCore常用了TCP通信,tcp通信也是存在心跳的,网络是异常退出(比如,任务管理器直接杀死游戏进程),tcp协议不会通知说我已经退出。如果是实时再线格斗类型游戏,建议常用UDP。TrinityCore大量使用c++ 0x11,有些地方,我也不是明白,如果有存在错误的地方也请指出。

trinitycore MySQL模块_TrinityCore MMORPG服务器设计分析相关推荐

  1. nodeJS+express+mysql模块封装之服务器渲染小demo

    nodeJS+express+mysql模块封装之服务器渲染小demo 创建一个小项目 npm init 下载相关中间件(根据package.js来下载) package.js 目录结构 index. ...

  2. trinitycore MySQL模块_Windows下编译TrinityCore服务端

    第一步建立文件夹 在任意分区根目录建议一个文件夹,但是名称不要用中文,比如我在E盘建立文件夹Trinity. 然后在文件夹Trinity右键选择Git Bash Here 之后出现以下画面 之后输入下 ...

  3. linux phpinfo mysql_linux服务器 phpinfo 里面找不到 mysql 模块,也没有 pdo_mysql

    linux服务器 phpinfo 里面找不到 mysql 模块,也没有 pdo_mysql linux服务器 phpinfo 里面找不到 mysql 模块,也没有 pdo_mysql 放到服务器上报错 ...

  4. 下载perl的mysql模块_安装用于操作MySQL的Perl模块

    在我使用Webmin(version 1.480)管理FreeBSD主机上的MySQL数据库服务器时出现: "警告:您的系统未安装Perl 模块 DBI 和 DBD::mysql,Webmi ...

  5. mysql_connect() 不支持 请检查 mysql 模块是否正确加载

    在上面文章的基础上配置PHP环境完成之后发现安装(discuz)论坛时候还是有问题! 函数名称                                检查结果          建议 mysq ...

  6. http协议、模块、express框架以及路由器、中间件和mysql模块

    一.http协议 是浏览器和web服务器之间的通信协议 1.通用头信息 request url:请求的url,向服务器请求的数据 request method:请求的方式   get.post sta ...

  7. ELK 经典用法—企业自定义日志收集切割和mysql模块

    ELK 经典用法-企业自定义日志收集切割和mysql模块 一.收集切割公司自定义的日志 很多公司的日志并不是和服务默认的日志格式一致,因此,就需要我们来进行切割了. 1.需切割的日志示例 2018-0 ...

  8. Nodejs学习笔记(六)——Mysql模块

    [目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http ...

  9. php简单的功能模块,php中mysql模块部分功能的简单封装

    php中mysql模块部分功能的简单封装 复制代码 代码如下: class mysql { private $db; // datebase connect private $result; // m ...

  10. Node.js(三)路由器、中间件、MySQL模块、RESTful接口

    一.路由器 用来管理路由,将一个模块下所有的路由放到一起,最后被WEB服务器使用.用法如下: //路由器下: const express = require('express'); //引入expre ...

最新文章

  1. 一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整合到一起
  2. 中科院的matlab课件,中科院的matlab课件
  3. 大数据旅游网站Hopper获新一轮1600万美元融资
  4. Android编译错误: The project cannot be built until build path errors are resolved
  5. UVa272-TeX中的引号
  6. 2021年安徽普通高考考试成绩查询,安徽省教育招生考试院:2021年安徽高考查分入口、查分系统...
  7. Django表单form
  8. ta leader是什么岗位_干货 丨 八卦下,应届/实习生应该跟什么样的leader?
  9. miinCMP企业网站系统,正开发新浪SAE云应用版
  10. 学flash就丢人吗?
  11. HikariCP介绍
  12. 面试技巧(2) 个人面试注意事项
  13. java基础:面向对象编程23-this课后练习boygirl
  14. MPB:广东生态土壤所孙蔚旻组-DNA稳定同位素示踪与宏基因组单菌草图组装联用技术...
  15. 欧莱雅的矿物质粉今天去买回来了
  16. HTML应用开发基础篇 - MUI 框架(三)MUI 布局
  17. 打开jupter notebook报错[WinError 10049]
  18. 峰值检测(个人笔记)
  19. 机架感知(RackAwareness)
  20. 微信公众号每日推送(小白网页版配置)

热门文章

  1. AMD显卡怎么提高帧数?AMD显卡提高fps的方法
  2. 解决:ARouter 报错 There is no route matched
  3. Linux常用命令宝典(简单易懂)
  4. [OpenCV实战]1 基于深度学习识别人脸性别和年龄
  5. bootStrap3 垂直居中
  6. BIM模型文件下载——江湖别墅Revit模型
  7. 网易云音乐评论 破解JS加密参数
  8. Android 显示软键盘输入法和强制隐藏软键盘输入法
  9. 7474触发器 异步三进制加法计数器
  10. 如何学计算机打字,电脑怎么学打字