|  | 
 
| [传奇技术]God引擎专区 客户端源码分析 res/config/accountpassword.xml读取代码分析 God引擎专区 客户端源码分析  res/config/accountpassword.xml读取代码分析
 
 复制代码bool xmlManager::ReadEditionUrl(string filename)
{
        // 从指定文件中获取 XML 内容到 xmlBuffer
        string xmlBuffer = FileUtils::getInstance()->getStringFromFile(filename);
        
        // 如果 xmlBuffer 为空,则记录错误日志并返回 false
        if (xmlBuffer.empty())
        {
                logAll("ReadEditionUrl: load xml failed [%s]", filename.c_str());
                return false;
        }
        
        {
                // 创建一个 XMLDocument 对象 kDoc
                tinyxml2::XMLDocument kDoc;
                
                // 使用 kDoc 解析 xmlBuffer,如果解析失败,则记录错误日志并返回 false
                if (kDoc.Parse(xmlBuffer.c_str()))
                {
                        logAll("ReadEditionUrl: parse xml failed [%s]", filename.c_str());
                        return false;
                }
                
                // 获取根节点
                tinyxml2::XMLElement* root = kDoc.RootElement();
                
                // 获取名为 "EDITION" 的子节点
                tinyxml2::XMLElement* svrNode = root->FirstChildElement("EDITION");
                
                // 如果 svrNode 存在,则获取其属性 "URL" 的值,并将其转换为 ASCII 编码保存到全局变量 g_sEditionUrl
                if (svrNode)
                {
                        g_sEditionUrl = CharsetConvert::u2a(svrNode->Attribute("URL"));
                }
                
                // 继续获取名为 "Channel" 的子节点
                svrNode = root->FirstChildElement("Channel");
                
                // 如果 svrNode 存在,则获取其属性 "Name" 的值,并将其转换为整数保存到全局变量 g_channelId
                if (svrNode)
                {
                        const char* attr = svrNode->Attribute("Name");
                        
                        // 如果 attr 存在,则将其转换为整数保存到 g_channelId
                        if (attr)
                        {
                                g_channelId = atoi(attr);
                        }
                }
        }
        
        // 创建一个 HttpRequestEx 对象 httpReq 和 HttpConfig 对象 httpConfig,并设置超时时间为 3 秒
        HttpRequestEx httpReq;
        HttpConfig httpConfig;
        httpConfig.sendTimeOut = 3;
        httpConfig.recvTimeOut = 3;
        httpConfig.dnsTimeOut = 3;
        httpConfig.connTimeOut = 3;
        httpReq.setConfig(httpConfig);
        // 创建一个字符串变量 kBufferRecv,用于接收 HTTP 请求的响应数据
        std::string kBufferRecv;
        httpReq.m_pBufferRecv = &kBufferRecv;
        
        int nTryCount = 1;
        
        // 最多进行三次重试
        while (nTryCount <= 3)
        {
                // 发送 HTTP GET 请求到 g_sEditionUrl 指定的地址,并将响应数据保存到 kBufferRecv
                int32_t err = httpReq.sendGetRequest(CharsetConvert::a2u(g_sEditionUrl));
                
                // 如果请求成功且接收到数据,则调用 ReadEditionServerListUrl 函数处理数据并返回结果
                if (!err && !kBufferRecv.empty())
                {
                        return ReadEditionServerListUrl(kBufferRecv);
                }
                else
                {
                        // 如果请求失败或者没有接收到数据,则记录错误日志,并进行下一次重试
                        logAll("ReadEditionUrl: download EditionUrl failed [%d], TRY[%d], [%s]", err, nTryCount, g_sEditionUrl.c_str());
                }
                
                nTryCount++;
        }
        
        // 所有重试都失败,则返回 false
        return false;
}
 
 | 
 |