1.下载使用
官方example地址:http://curl.haxx.se/libcurl/c/fopen.html
static size_t downLoadPackage(void *ptr, size_t size, size_t nmemb, void *userdata)
{ FILE *fp = (FILE*)userdata; //要写入数据地址、写入内容的单字节数size:1、size个数、文件指针: 返回的written==nmemb size_t written = fwrite(ptr, size, nmemb, fp); return written; } static int progressFunc(void *ptr, double totalToDownload, double nowDownloaded, double totalToUpLoad, double nowUpLoaded) { CCLOG("downloading... %d%%", (int)(nowDownloaded/totalToDownload*100)); return 0; } bool MyDownload::downLoad() { string outFileName = _storagePath + TEMP_PACKAGE_FILE_NAME; //存放文件地址 FILE *fp = fopen(outFileName.c_str(), "wb"); if (! fp) { CCLOG("can not create file %s", outFileName.c_str()); return false; } /* 下载必须的设置,带有进度条: 出错对应的enum、初始化 下载回调函数: 要写入数据地址、写入内容的单字节数size:1、size个数(总的size个数数文件大小)、文件指针: 返回的written==nmemb static size_t downLoadPackage(void *ptr, size_t size, size_t nmemb, void *userdata)、 必须有、 指向写入文件的指针,如果是string则&_version地址、 设置成false、 显示下载进度或上传进度: static int progressFunc(void *ptr, double totalToDownload, double nowDownloaded, double totalToUpLoad, double nowUpLoaded)、 执行、清理 失败、下载成功 错误: 没有初始化 失败:CURLcode res 43 CURLOPT_SSL_VERIFYPEER没有CURLcode res报错 60 执行时错误 1 可能下载地址有错 */ CURLcode res; _curl = curl_easy_init(); res = curl_easy_setopt(_curl, CURLOPT_URL, _packageUrl.c_str()); res = curl_easy_setopt(_curl, CURLOPT_WRITEFUNCTION, downLoadPackage); res = curl_easy_setopt(_curl, CURLOPT_SSL_VERIFYPEER, 0L); res = curl_easy_setopt(_curl, CURLOPT_WRITEDATA, fp); res = curl_easy_setopt(_curl, CURLOPT_NOPROGRESS, false); res = curl_easy_setopt(_curl, CURLOPT_PROGRESSFUNCTION, progressFunc); 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); return true; }
//获取下载信息、连接时间、错误信息
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE, responseCode);//int32_t *responseCode
curl_easy_setopt(handle,CURLOPT_TIMEOUT,int32_t 类型); //CURL *handle
curl_easy_setopt(handle,CURLOPT_TIMEOUT, int32_t 类型);
curl_easy_setopt(handle,CURLOPT_ERRORBUFFER, errorBuffer);//staticchar errorBuffer[256];
断点下载
curl_easy_setopt(curl, CURLOPT_RANGE, b.c_str()) // b已经完成多少字节
size_t writeFile(void *ptr, size_t size, size_t nmemb, void *stream) //b是nmemb的 不断累加