libcurl 基本使用
libcurl,在HLS流媒体播放终端上提供HTTP下载的相关接口。具体的使用方式可以参见http://curl.haxx.se/libcurl/c/libcurl-tutorial.html,或博客http://www.cppblog.com/tx7do/archive/2012/02/19/166011.html。
代码:
- m_pCurl = curl_easy_init();
- if (m_pCurl == NULL)
- break;
- curl_easy_reset(m_pCurl);
- curl_easy_setopt(m_pCurl, CURLOPT_URL, url.c_str());
- curl_easy_setopt(m_pCurl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(m_pCurl, CURLOPT_CONNECTTIMEOUT, 3);
- //curl_easy_setopt(m_pCurl, CURLOPT_TIMEOUT, 30);
- curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, 1L);
- //curl_easy_setopt(m_pCurl, CURLOPT_LOW_SPEED_LIMIT, 1);
- //curl_easy_setopt(m_pCurl, CURLOPT_LOW_SPEED_TIME, 120); // 120s的时间内速度小于1byte/s,则取消下载
- curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, writeTsData_Local);
- curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, (LPVOID)this);
- m_downloadThreadFlag = true;
- retCode = curl_easy_perform(m_pCurl);
- double downloadTotalTime; // 记录下载的时间长度
- double downloadSpeed;// 记录下载速度
- CURLcode re = curl_easy_getinfo(m_pCurl, CURLINFO_SPEED_DOWNLOAD, &downloadSpeed); // 获取下载速度
- curl_easy_getinfo(m_pCurl, CURLINFO_TOTAL_TIME, &downloadTotalTime);
- curl_easy_cleanup(m_pCurl);
1、void curl_easy_reset(CURL *handle ); 重置CURL
2、CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
CURLOPT_URL,添加下载的URL
CURLOPT_WRITEFUNCTION, 设置回调存储数据函数
CURLOPT_CONNECTTIMEOUT, 设置连接超时时间
CURLOPT_LOW_SPEED_LIMIT, 设置最低下载速度
CURLOPT_LOW_SPEED_TIME, 设置最低下载速度持续的时间
CURLOPT_FOLLOWLOCATION, 设置为1,否则会导致回调函数只执行一次
3、CURLcode curl_easy_perform(CURL * handle ); 启动下载
4、CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); 可以获取下载的相关信息,如下载时长、下载速度等。
5、void curl_easy_cleanup(CURL *curl); 关闭CURL
主要使用的就是这五个函数。建议在connectTimeOut不要设置时间过长。如果设置太长后,有时会导致退出时程序挂起现象。获取下载相关信息getInfo是必要的,可以通过它来判断程序网络连接情况。如下载时长远远大于片段播放时长,且缓存中存储的量过少时,则需要调用Pause进行数据缓冲。当下载速度为0 b/s时,则需要提示用户检测网络。
以下是数据接收的回调函数:
- size_t TsDataThread::writeTsData_Local(void *buffer, size_t size, size_t nmemb, void *userp)
- {
- if (false == downloadflag || true == isStop)
- return 0;
- if (elementSize >= preElementSize)
- {
- TsDataThread* pUDPReader = (TsDataThread*)userp;
- pUDPReader->addBuff(buffer, size, nmemb, userp);
- elementSize += nmemb;
- }
- return size*nmemb;
- }
要注意如果用户中途退出,且下载线程仍再继续时,不能强制关闭CURL。通过回调中返回0值,使其正常退出CURL。还有就是如果第一次下载片度在elementSize位置处,下载失败。则在第二次下载时一定要从elementSize位置存储数据。否则播放效果将有很大的影响。
libcurl 基本使用的更多相关文章
- (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)
1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...
- (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)
1. 利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...
- 用libcurl 登录网站
libcurl 可以发送和接收HTTP消息,因此可以发送用户名.密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来. 基本步骤 正常访问登录页面,访问时,设置 ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- 错误解决:error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
执行以下代码,生成唯一的UID $fp = popen("/xxx/bin/tools/uuidgen system", "r");// $uid = frea ...
- 交叉编译总结 libosscore.a libcurl.a libmysqlclient.a
把工程文件交叉编译到arm上运行,着实花费了一番功夫. 首先遇到的错误是 X uses VFP register arguments, B does not 百度了一下,发现是硬浮点和软浮点的问题,原 ...
- 安装zabbix报错configure: error: libcurl library not found
libcurl 和libcurl-devel都已经安装 且大于7.13.1 但还是报错,这时需要在configure 指定curl路径即可 ./configure --prefix=/usr/loca ...
- libcurl教程
名称 libcurl 的编程教程 目标 本文档介绍使用libcurl编程的一般原则和一些基本方法.本文主要是介绍 c 语言的调用接口,同时也可能很好的适用于其他类 c 语言的接口. 跨平台的可移植代码 ...
- Libcurl多线程crash问题(cento)
cento :http://blog.csdn.net/delphiwcdj/article/details/18284429 1 问题背景 后台系统有一个单线程的http接口,为了提高并发处理能力, ...
- libcurl 函数curl_easy_perform在release下崩溃的问题
今天遇到一个很奇怪的问题: 工程中用到了libcurl, debug可以正常运行,release每次都崩溃,断到curl_easy_perform这一行.堆栈中也得不到有用信息,于是GOOGLE一番, ...
随机推荐
- 利用Filter实现session拦截
1.在web.xml中配置 <!-- Session监听器 --> <filter> <filter-name>sessionValidateFilter</ ...
- sql时间区间查询性能测试
这个测试针对"一个月"的区间来查询数据.分datetime类型和nvachar类型. 先比较datetime类型: 一.datediff函数 declare @beginTime ...
- 互联网轻量级框架SSM-查缺补漏第一天
简言:工欲其事必先利其器,作为一个大四的准毕业生,在实习期准备抽空补一下基础.SSM框架作为互联网的主流框架,在会使用的基础上还要了解其原理,我觉得会对未来的职场会有帮助的.我特意的买了一本<J ...
- 字符串(1)——Detect Capital
Given a word, you need to judge whether the usage of capitals in it is right or not. We define the u ...
- Angular6 基础(数据绑定、生命周期、父子组件通讯、响应式编程)
Angular相比于vue来说,更像一个完整的框架,本身就集成了很多模块,如路由,HTTP,服务等,而vue是需要另外引入比如(vuex,axios等).Angular引入了依赖注入.单元测试.类等后 ...
- axios 发 post 请求,后端接收不到参数的解决方案
问题场景 场景很简单,就是一个正常 axios post 请求: axios({ headers: { 'deviceCode': 'A95ZEF1-47B5-AC90BF3' }, method: ...
- c语言进制转化
#include <stdio.h> // 进制转化 int main(void) { ; ; int i3 = 0x32C; printf( printf( printf("十 ...
- Network Request Failed
在react native项目中,有时候调用接口会出现这样的错误提示:“Network Request Failed”. 一.模拟器上报“Network Request Failed”解决办法,也是官 ...
- css:改变滚动条样式
以下亲测谷歌内核的浏览器有用,微软和火狐无效 body::-webkit-scrollbar {/*滚动条整体样式*/ width: 5px; /*高宽分别对应横竖滚动条的尺寸*/ height: 1 ...
- ubuntu 火狐浏览器中常规方法安装flashplayer的问题
之前在网上看到很多朋友介绍了许多如何在ubuntu安装flashplayer 的方法!但是我的操作系统不知怎么的就是不能成功的安装!使我十分的苦恼!但是在我纲要邪气的时候再网上又看到一位朋友的解决方案 ...