cocos2d-x使用curl获取文件大小
2016-08-27 20:59
323 查看
由于手游项目中部分游戏房间游戏资源是动态下载的,还有安卓APK包提示版本更新在线安装时也需要先获取到安装包大小,提示玩家本次更新所耗流量,故用curl写了个获取文件大小的功能,后面还会用curl实现热更新功能;
首先说下原理,由于http底层其实也是由socket实现的,默认端口通常是80端口,数据的传输则根据http相关协议进行编写传输,故自己用socket写一个http请求并做好相应数据解析也是可以实现的,但再造个轮子要考虑的比较多,不在此文讨论之列,且CURL是一个很成熟通用的库,所以此处使用curl来实现获取文件大小;
#include <curl/curl.h>
#include <curl/easy.h>
#include <thread>
#define LOW_SPEED_LIMIT 1L
#define LOW_SPEED_TIME 5L
size_t save_header(void *ptr, size_t size, size_t nmemb, void *data)
{
return (size_t)(size * nmemb);
}
void URLLoader::loadURLHead(const char* url)
{
auto curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST,"GET"); //使用CURLOPT_CUSTOMREQUEST
// curl_easy_setopt(handle, CURLOPT_HEADER, 1); //部分服务器可能不支持Header响应
curl_easy_setopt(curl, CURLOPT_NOBODY, 1); //不需求body,只获取http头响应
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, save_header);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, LOW_SPEED_LIMIT);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, LOW_SPEED_TIME);
auto t = std::thread(&URLLoader::onURLThread, this,curl);
t.detach();
}
void URLLoader::onURLThread(void* curl)
{
// URLData* urlData = new URLData(-1,"");
CURLcode res;
do{
res = curl_easy_perform(curl);
if (res != 0)
{
break;
}else{
CURLcode return_code;
long retcode = 0;
//状态码
return_code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode);
CCLOG("return_code:%ld",retcode);
// urlData->setStatusCode(retcode);
if((CURLE_OK!=return_code) || !retcode)
{
break;
}
//响应内容长度
double downLength = 0;
curl_easy_getinfo(curl,CURLINFO_CONTENT_LENGTH_DOWNLOAD,&downLength);
// urlData->setContentLength((size_t)downLength);
CCLOG("downLength:%f",downLength);
}
}while (0);
curl_easy_cleanup(curl);//清理
//主线程响应
Director::getInstance()->getScheduler()->performFunctionInCocosThread([&, this,urlData]{
//数据处理...
});
}
以上为相关核心代码,使用时配置好curl头文件搜索路径,如xcode下为:$(SRCROOT)/../../cocos2d-x/external/curl/include/ios
URLLoader是自己封装的一个导出给Lua使用的http类,URLData类是响应相关数据的封装,在此就不贴出代码了~
首先说下原理,由于http底层其实也是由socket实现的,默认端口通常是80端口,数据的传输则根据http相关协议进行编写传输,故自己用socket写一个http请求并做好相应数据解析也是可以实现的,但再造个轮子要考虑的比较多,不在此文讨论之列,且CURL是一个很成熟通用的库,所以此处使用curl来实现获取文件大小;
#include <curl/curl.h>
#include <curl/easy.h>
#include <thread>
#define LOW_SPEED_LIMIT 1L
#define LOW_SPEED_TIME 5L
size_t save_header(void *ptr, size_t size, size_t nmemb, void *data)
{
return (size_t)(size * nmemb);
}
void URLLoader::loadURLHead(const char* url)
{
auto curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST,"GET"); //使用CURLOPT_CUSTOMREQUEST
// curl_easy_setopt(handle, CURLOPT_HEADER, 1); //部分服务器可能不支持Header响应
curl_easy_setopt(curl, CURLOPT_NOBODY, 1); //不需求body,只获取http头响应
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, save_header);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, LOW_SPEED_LIMIT);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, LOW_SPEED_TIME);
auto t = std::thread(&URLLoader::onURLThread, this,curl);
t.detach();
}
void URLLoader::onURLThread(void* curl)
{
// URLData* urlData = new URLData(-1,"");
CURLcode res;
do{
res = curl_easy_perform(curl);
if (res != 0)
{
break;
}else{
CURLcode return_code;
long retcode = 0;
//状态码
return_code = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE , &retcode);
CCLOG("return_code:%ld",retcode);
// urlData->setStatusCode(retcode);
if((CURLE_OK!=return_code) || !retcode)
{
break;
}
//响应内容长度
double downLength = 0;
curl_easy_getinfo(curl,CURLINFO_CONTENT_LENGTH_DOWNLOAD,&downLength);
// urlData->setContentLength((size_t)downLength);
CCLOG("downLength:%f",downLength);
}
}while (0);
curl_easy_cleanup(curl);//清理
//主线程响应
Director::getInstance()->getScheduler()->performFunctionInCocosThread([&, this,urlData]{
//数据处理...
});
}
以上为相关核心代码,使用时配置好curl头文件搜索路径,如xcode下为:$(SRCROOT)/../../cocos2d-x/external/curl/include/ios
URLLoader是自己封装的一个导出给Lua使用的http类,URLData类是响应相关数据的封装,在此就不贴出代码了~
相关文章推荐
- jsp页面使用javascript获取文件的大小
- vbs Size 属性使用介绍(获取文件大小)
- linux 使用lseek函数来获取文件大小
- 4000 使用C语言获取文件大小……
- (二)使用libcurl实现获取目标文件大小, 下载进度显示, 断点续传等功能
- php 中curl获取用户文件的大小
- php使用curl下载指定大小的文件
- cocos2d-x学习笔记(七)利用curl获取资源包的大小
- curl不使用文件存取cookie php使用curl获取cookie示例
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
- C++ 下使用curl 获取ftp文件
- php使用curl下载指定大小的文件实例代码
- 使用Win API 获取文件大小(可获取正在使用的文件,包括独占方式打开的文件GetFileSize)
- curl不使用文件存取cookie php使用curl获取cookie示例
- 使用curl命令获取文件下载速度
- curl不使用文件存取cookie php使用curl获取cookie示例
- php使用curl下载指定大小的文件
- 建议linux下使用stat()获取文件大小
- Cocos2d-3.10 使用Curl异步下载文件(断点续传)
- stat函数的使用 获取文件状态 可以将文件状态复制保存在一个stat结构地址中,以此取得文件的大小等状态