CURL的两种基本使用

第一种情况是 直接从网页上获取一个字符串,常用于游戏的版本号获取之类的,处理方法如下:

CURL* curl;
 CURLcode res;

 char buffer[10] ={0};

 curl = curl_easy_init();//curl初始化
 std::string _version;
 if (curl)
 {
  curl_easy_setopt(curl,  CURLOPT_URL, "
https://raw.github.com/minggo/AssetsManagerTest/master/version");
  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);//设为不验证证书
  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getVersionCode);//设置处理数据的函数
  curl_easy_setopt(curl, CURLOPT_WRITEDATA, &_version);//数据存储的对象指针
  res = curl_easy_perform(curl);//curl链接
  curl_easy_cleanup(curl);//清除curl

  
 }

 

static size_t getVersionCode(void *ptr, size_t size, size_t nmemb, void *userdata)
{//参数userdata是存放数据的指针  其他三个获取内容
 std::string *version = (std::string*)userdata;
 version->append((char*)ptr, size * nmemb);

 return (size * nmemb);
}

 

另一种情况则是需要从网上下载更新包

string outFileName = _storagePath + TEMP_PACKAGE_FILE_NAME;//下载文件的存放位置
    FILE *fp = fopen(outFileName.c_str(), "wb");//新建并打来一个文件 以便下载后写入
    if (! fp)
    {
        sendErrorMessage(kCreateFile);
        CCLOG("can not create file %s", outFileName.c_str());
        return false;
    }
   
    // Download pacakge
    CURLcode res;
    curl_easy_setopt(_curl, CURLOPT_URL, _packageUrl.c_str());//设定curl的链接
    curl_easy_setopt(_curl, CURLOPT_WRITEFUNCTION, downLoadPackage);
    curl_easy_setopt(_curl, CURLOPT_WRITEDATA, fp);//设置将data写入到文件流fp中
    curl_easy_setopt(_curl, CURLOPT_NOPROGRESS, false);//设为false 下面才能设置进度响应函数
    curl_easy_setopt(_curl, CURLOPT_PROGRESSFUNCTION, assetsManagerProgressFunc);//进度响应函数
    curl_easy_setopt(_curl, CURLOPT_PROGRESSDATA, this);//数据传输的对象
    res = curl_easy_perform(_curl);
    curl_easy_cleanup(_curl);
    if (res != 0)
    {
        
        CCLOG("error when download package");
        fclose(fp);
        return false;
    }
   
    CCLOG("succeed downloading package %s", _packageUrl.c_str());
   
    fclose(fp);

 

数据写入函数跟之前的getVersionCode差不多  只是向不同的对象写入  用的函数也不一样

static size_t downLoadPackage(void *ptr, size_t size, size_t nmemb, void *userdata)
{
    FILE *fp = (FILE*)userdata;
    size_t written = fwrite(ptr, size, nmemb, fp);
    return written;
}

 

进度条响应函数的功能主要是 更新下载的进度  即为 (int)nowDownloaded/totalToDownload*100

assetsManagerProgressFunc(void *ptr, double totalToDownload, double nowDownloaded, double totalToUpLoad, double nowUpLoaded) 

当然更新包下载下来,还需要解压,替换等步骤,留待下文

你可能感兴趣的:(CURL的两种基本使用)