先做个对比:卓越版本的分布式构架,相对于之前的版本旗舰、荣耀、大众、经典、6603等版本。在分布式上做了优化,更为可靠,高效,安全。

1. 采用websocket通信,更为安全可靠,同时可以和后台直接通信,后台修改数据,在线的手机端及时同步。

2. 兼顾web端、微信小游戏,可以和C++服务器直接二进制通信,客户端使用TypeScript(JavaScript的超集),一份代码可以发布到iOS,Android,Web,WeChatGame等平台,节省了更多的开发成本。

3. 前端和服务端使用长连接,相比与之前的版本短连接,更高效,体验更好。只连接一个服务器,进入子游戏不需要断开连接,再去连接子游戏服务器,一切都是通过链接服务器内部中转。

4. 内核采用心跳机制。超过一定时间未收到前端的消息,会主动向前端放一个心跳数据,超过一段时间没有收到新的数据,就断开剔除连接。这种机制在长连接中非常有必要,防止假死连接,服务器连接资源被消耗完的情况。

5. 可以开启多个链接服务器,网站接口直接跟服务器通信,获取最佳的IP和端口,达到负载均衡的问题,又保护了服务器的IP信息。

6. 链接服务器仅仅做消息的转发,不做数据库相关的操作,也没有关键代码的操作。即便某个链接服务器所在的服务器被黑客攻陷,也不影响整个系统的正常的运行,更得不到数据库相关的信息。

综上所述,卓越的这个版本系统更为优化。但目前前端没有约占、大联盟功能。

下面来介绍逆向过程。

经过对内核引擎、LogicServerData.dll的逆向,综合前端TypeScript代码的阅读理解。对链接服务器的功能有了基本了解。

启动链接服务器,分别会去连接协调、用户状态、逻辑、约占服务器。这才算启动成功,然后又去连接子游戏服务器。

并且都有断线重连功能的。

这些功能在对应的服务器代码里也得到了印证。

协调服务器的代码

//注册链接
bool CAttemperEngineSink::OnRegisterLinkServer(VOID* pData, WORD wDataSize, DWORD dwSocketID);

用户状态服务器、逻辑服务器

//注册链接
bool CAttemperEngineSink::OnRegisterLinkServer(VOID* pData, WORD wDataSize, DWORD dwSocketID);

约战服务器、游戏服务器

//注册服务
bool CAttemperEngineSink::OnTCPNetworkMainRegister(WORD wSubCmdID, VOID* pData, WORD wDataSize, DWORD dwSocketID);

上面的几个函数有注册的具体逻辑。

下面开始IDA

这里有两个重要的类成员

 //子游戏连接
protected:CTCPSocketServiceArray            m_TCPSocketServiceArray;            //连接数组CTCPSocketServiceArray            m_TCPSocketServiceStore;            //存储连接

用于保存子游戏的链接。

有两个关键函数,激活、删除连接

CInitParameter加载本地配置

CDlgSetPort端口选择

//更新数据
bool CDlgSetPort::FillControlToData()
{int nTmp = GetDlgItemInt(IDC_SERVER_PORT);if (nTmp >= 0 && nTmp<1024 || nTmp >= 0xFFFF){LPCTSTR pszQuestion = TEXT("提示:端口范围1025~65534");AfxMessageBox(pszQuestion, MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION);// != IDYESreturn false;}m_wServicePort = (WORD)nTmp;return true;
}

GlobalInfoManager.h

class CGlobalInfoManager
{//索引变量
protected:CMapGameServerID              m_MapGameServerID;                      //房间标识//存储变量
protected:CGlobalGameServerItem *           m_pGlobalGameServerItem;                //房间存储//函数定义
public://构造函数CGlobalInfoManager();//析构函数virtual ~CGlobalInfoManager();//管理函数
public://重置数据VOID ResetData();//房间数目DWORD GetGameServerItemCount() { return (DWORD)m_MapGameServerID.GetCount(); }//房间管理
public://删除房间bool DeleteGameServerItem(WORD wServerID);//激活房间CGlobalGameServerItem * ActiveGameServerItem(GameServerItem & GameServer, WORD wServerID);//服务查找
public://寻找房间CGlobalGameServerItem * SearchGameServerItem(WORD wServerID);//寻找连接ITCPSocketService * SearchGameServerTCPSocketService(WORD wServerID);//枚举函数
public:CGlobalGameServerItem * EnumGameServerItem(POSITION & Position);//创建函数
public://创建房间CGlobalGameServerItem * CreateGlobalGameServerItem();//释放函数
private://释放房间bool FreeGlobalGameServerItem(CGlobalGameServerItem * pGlobalGameServerItem);
};

最重要的AttemperEngineSink部分,消息的转发

断线重连部分代码截图

还有此启动过程、断线重连、分布式服务器之间的注册、转发消息、中断连接、进入子游戏的处理等。这里不再一一详尽说明。

以上IDA很多方法的名字是我分析后,重命名的。直接通过IDA分析出来的方法没有这么好懂的,需要自己分析逻辑是干啥的,再做重命名的。

到此基本完工

预告:下一节,介绍如何搞定Cocos Creator发布后的手机端的底层(iOS,Android)

逆向链接服务器(分布式服务器之前的协调通信,同步,消息的转发)相关推荐

  1. grab显示连不上服务器,grab 暂时链接不到服务器

    grab 暂时链接不到服务器 内容精选 换一换 将ISO文件注册为ISO镜像后,无法在创建云服务器页面选择到,也无法用来切换操作系统,必须完成操作系统及驱动安装做成系统盘镜像后才能使用.ISO镜像在镜 ...

  2. eve显示无法连接服务器,eve 链接不到服务器

    eve 链接不到服务器 内容精选 换一换 将ISO文件注册为ISO镜像后,无法在创建云服务器页面选择到,也无法用来切换操作系统,必须完成操作系统及驱动安装做成系统盘镜像后才能使用.ISO镜像在镜像服务 ...

  3. obs显示无法连接到服务器,obs链接不到服务器

    obs链接不到服务器 内容精选 换一换 obsutil是适用于Windows.macOS和Linux操作系统的命令行工具,支持通过配置内网DNS服务器地址的方式,使在华为云上的Linux ECS通过内 ...

  4. 分布式服务器架构下的3v3团队对抗游戏

    [Warning] 本仓库作为本人的毕设课题,主要是初学者的学习/实践,谨慎用于正式用途. Github仓库链接:https://github.com/ZerlenZhang/distributed- ...

  5. 深入浅出分布式服务器架构

    前言 本文是对分布式服务器架构的由来进行介绍,要开发一款网络游戏自然不能对开发网络游戏的历史一无所知,充分了解网络游戏开发的历史也能加深对当前网络游戏架构的理解 下面就来看一看网络游戏的服务器是如何一 ...

  6. 用java搭建一个分布式服务器(一)

    本专栏主要介绍如何用java实现一个小型分布式(单机多进程模式)服务器,希望能给刚开始学分布式的朋友一些帮助.讲得不对的地方欢迎在评论区指出. 用到的主要技术栈: netty 网络传输框架 sprin ...

  7. pubg显示连不上服务器,pubg链接不到服务器

    pubg链接不到服务器 内容精选 换一换 将ISO文件注册为ISO镜像后,无法在创建云服务器页面选择到,也无法用来切换操作系统,必须完成操作系统及驱动安装做成系统盘镜像后才能使用.ISO镜像在镜像服务 ...

  8. 链接SQL Server服务器

    链接SQL Server服务器:    1.使用 ODBC 的 Microsoft OLE DB 提供程序       EXEC sp_addlinkedserver '别名','','MSDASQL ...

  9. fz响应无法连接到服务器,fz链接不到服务器

    fz链接不到服务器 内容精选 换一换 在本章节中,您将运行已部署好的游戏,登录游戏客户端.已准备好Windows机器,硬盘至少20G,且必须安装有显卡.服务器地址:节点的弹性IP地址,请登录CCE控制 ...

最新文章

  1. 处理过拟合问题-Regularization
  2. PyQt5 技术篇-调用字体对话框(QFontDialog)获取字体,控件设置字体。
  3. I.MX6 Android busybox 从哪里生成的
  4. Fast Paxos
  5. 时钟服务器地址_时钟同步 Chrony 教程
  6. 三菱plc分拣程序_三菱PLC实现电梯控制方案,含全套程序设计
  7. froala富文本编辑器与golang、beego,脱离ueditor苦海
  8. 道格拉斯-普克抽稀算法 曲线平滑
  9. GATK RNA-Seq Snps Indel 分析
  10. mac插网线不能上网_苹果笔记本连接网线不能上网怎么回事
  11. 命令行如何 copy 文件内容到剪切板(clipboard)?
  12. pytorch CNN手写字体识别
  13. opencv-python 实现角点检测和棋盘角点检测
  14. WordPress Avada主题评测:非常受欢迎但值得吗? (2022)
  15. Java程序性能优化——性能调优层次
  16. Arduino实验十 利用土壤湿度传感器检测西瓜皮湿度
  17. 删除下拉框只找23火星软件_下拉词删除就找23火星
  18. 如何利用研发管理工具 更好实践IPD流程
  19. Java | Java 基础语法(上)
  20. 漫画 | 最让程序员抓狂的7件事

热门文章

  1. 【题解】LuoGu8813: [CSP-J 2022] 乘方
  2. 微服务模式系列之九:独享数据库
  3. redmi ac2100 红米ac2100路由器 padavan固件
  4. java字符集转换 Big5 和 Unicode互转
  5. Infernet服务器为空怎么办,电脑internet页面空白怎么办?
  6. android手机网速,你的手机网速太慢?可以试一下调整这个设置,网速瞬间提升...
  7. SAP中生产成本收集器控制级别变更实例
  8. 开发者危机!GitHub、GitLab 全部大裁员
  9. php insert什么意思,PHP insert语法详解
  10. 摩托罗拉各地网站被关闭