现在做项目可能很多时候要负责多个版本,所以共用的部分如果可以只写一份的话就大大减少工作量。比如移动端来说,主流的Android,iOS,WinPhone,如果我们用C/C++把底层通讯全部写好的话,那么移动平台只要负责界面显示就可以了。不需要写逻辑。本篇就简单讲述curl库的基本使用,用它就可以完成一些基于http的相关工作。
方法一:
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)
当然更新包下载下来,还需要解压,替换等步骤。
本文链接:https://it72.com/7757.htm