Android开源库curl的基本使用

Home / Android MrLee 2016-1-26 3114

现在做项目可能很多时候要负责多个版本,所以共用的部分如果可以只写一份的话就大大减少工作量。比如移动端来说,主流的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://www.it72.com/7757.htm

推荐阅读
最新回复 (0)
返回