[传奇技术]Legend客户端微端分析
核心单元PatchUnit 就两个类
TPatchClientManager 管理类并维护一个m_xObjectListT(PatchClient) 负责初始化socket 和 发送资源请求 并在ProcOnIdle 执行 ExecSendBuffer ExecRecvBuffer AssignedWMImages 用于存储服务端发送的wzl清单 ///////////////////////////////////// TPatchClient 实际的数据收发操作 m_ClientSocket: TClientSocket; 客户端socket 构造函数传递了一个TPatchClientManager对象
此函数处理接收的socket数据 ProcRecvBuffer 处理接收数据分析(pMsgHeader)并通过 AddProcRecvMsg添加到list(m_xProcRecvList) 交由ExecRecvBuffer处理 ------------------------------------------ TPatchData 消息包格式 ---------------------------------------- ////////////////////////////////////////////////////////////////////////////////// ExecSendBuffer //需要判断是否是第一次链接m_fFirstGetCrc 激活socket 从m_xTempProcSendList取出请求 发送数据请求 前段分析 实际是把请求的消息添加到m_xProcSendList 后段 从m_xProcSendList取出判断pPatchData.dwDelay 超时就删除请求 取出成功后分配内存 m_ClientSocket.Socket.SendBuf 发送请求 超时的交由end else begin m_ClientSocket.Socket.SendBuf(PatchData.tHdr, SizeOf(TMsgHeader)); //可能是重新请求?
----------------------------------------- ExecRecvBuffer 从m_xProcRecvList取出数据 成功后 后面分析包
PM_CRC //crc返回 m_fFirstGetCrc 为真 //首包? 并获取整个资源列表 前段 判断全部为空 清理所有请求的消息列表 获取的列表格式 wzl为单个图片 wzl/wav/map wzl 文件之间 | 分割其它类似 wzl,crc 逗号分隔 校验通过 按请求的图片 m_PatchClientManager.m_xWMImageList.IndexOf(szFileName) 放入m_nSvrWzlFileList(文件名,图片序号) wav map类似 只不过是整个文件 ------------------------------------------------------- 接下来向服务端返回本地校验?后来发现是个半成品。。 PatchData.tHdr.nSocket CRC文件数量 CnCRC32.FileCRC32(ParamStr(0), dwCRC); mir2.exe的crc -------------------------------------------------------
PM_INDEX 校验通过将打开wzl wzx文件 同时更新本地图片计数 和服务器一致
PM_DATA解析具体数据 ////////////////////////////////////////////////////////
SendProcMsg 发送请求包下载数据 map wzl wav直接的请求函数调用这个就行了 首次请求 消息加入m_xTempProcSendList 然后按类型文件名读取crc 通过CRC(pPatchData.tHdr.nSocket) 再次请求具体数据 消息加入m_xProcSendList
///////////////////////////////////////////
|