trinitycore MySQL模块_TrinityCore MMORPG服务器设计分析
本文是通过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服务器设计分析相关推荐
- nodeJS+express+mysql模块封装之服务器渲染小demo
nodeJS+express+mysql模块封装之服务器渲染小demo 创建一个小项目 npm init 下载相关中间件(根据package.js来下载) package.js 目录结构 index. ...
- trinitycore MySQL模块_Windows下编译TrinityCore服务端
第一步建立文件夹 在任意分区根目录建议一个文件夹,但是名称不要用中文,比如我在E盘建立文件夹Trinity. 然后在文件夹Trinity右键选择Git Bash Here 之后出现以下画面 之后输入下 ...
- linux phpinfo mysql_linux服务器 phpinfo 里面找不到 mysql 模块,也没有 pdo_mysql
linux服务器 phpinfo 里面找不到 mysql 模块,也没有 pdo_mysql linux服务器 phpinfo 里面找不到 mysql 模块,也没有 pdo_mysql 放到服务器上报错 ...
- 下载perl的mysql模块_安装用于操作MySQL的Perl模块
在我使用Webmin(version 1.480)管理FreeBSD主机上的MySQL数据库服务器时出现: "警告:您的系统未安装Perl 模块 DBI 和 DBD::mysql,Webmi ...
- mysql_connect() 不支持 请检查 mysql 模块是否正确加载
在上面文章的基础上配置PHP环境完成之后发现安装(discuz)论坛时候还是有问题! 函数名称 检查结果 建议 mysq ...
- http协议、模块、express框架以及路由器、中间件和mysql模块
一.http协议 是浏览器和web服务器之间的通信协议 1.通用头信息 request url:请求的url,向服务器请求的数据 request method:请求的方式 get.post sta ...
- ELK 经典用法—企业自定义日志收集切割和mysql模块
ELK 经典用法-企业自定义日志收集切割和mysql模块 一.收集切割公司自定义的日志 很多公司的日志并不是和服务默认的日志格式一致,因此,就需要我们来进行切割了. 1.需切割的日志示例 2018-0 ...
- Nodejs学习笔记(六)——Mysql模块
[目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(二)--模块 Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http ...
- php简单的功能模块,php中mysql模块部分功能的简单封装
php中mysql模块部分功能的简单封装 复制代码 代码如下: class mysql { private $db; // datebase connect private $result; // m ...
- Node.js(三)路由器、中间件、MySQL模块、RESTful接口
一.路由器 用来管理路由,将一个模块下所有的路由放到一起,最后被WEB服务器使用.用法如下: //路由器下: const express = require('express'); //引入expre ...
最新文章
- 一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整合到一起
- 中科院的matlab课件,中科院的matlab课件
- 大数据旅游网站Hopper获新一轮1600万美元融资
- Android编译错误: The project cannot be built until build path errors are resolved
- UVa272-TeX中的引号
- 2021年安徽普通高考考试成绩查询,安徽省教育招生考试院:2021年安徽高考查分入口、查分系统...
- Django表单form
- ta leader是什么岗位_干货 丨 八卦下,应届/实习生应该跟什么样的leader?
- miinCMP企业网站系统,正开发新浪SAE云应用版
- 学flash就丢人吗?
- HikariCP介绍
- 面试技巧(2) 个人面试注意事项
- java基础:面向对象编程23-this课后练习boygirl
- MPB:广东生态土壤所孙蔚旻组-DNA稳定同位素示踪与宏基因组单菌草图组装联用技术...
- 欧莱雅的矿物质粉今天去买回来了
- HTML应用开发基础篇 - MUI 框架(三)MUI 布局
- 打开jupter notebook报错[WinError 10049]
- 峰值检测(个人笔记)
- 机架感知(RackAwareness)
- 微信公众号每日推送(小白网页版配置)