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一番, ...
随机推荐
- 学习安卓开发过程中遇到关于R.Java文件的问题
在学习安卓开发过程时,遇到R.java生成问题,总结几个方法解决. 1.首先必须做的就是检查代码的正确性,存在错误的代码,不编译生成R.java 2.右键点项目,选择 Android Tools -& ...
- css设置文字中间的小竖线
主要css属性是border-right border-right:1px solid gray; padding-right:10px; padding-left:10px; <div dat ...
- 标头停止点不能位于宏或#if块中.
使用VS2010在项目中编写C++头文件**.h时提示: PCH 警告: 标头停止点不能位于宏或#if块中 原因:vs2010的智能感知要求.h必须以非#if系列的预编译指令打头 正确方法:将所有含有 ...
- android 调试卡在:Waiting for Debugger - Application XXX is waiting for the debugger to Attach" 解决方法
解决方法:重启adb. 步骤:cmd进入命令行,进入adb所在目录先后执行adb kill-server,adb start-server.
- Android 环信(Android)设置头像和昵称的方法
最近,经常有朋友问到,如何集成环信头像,怎么才能快速显示头像,因时间紧急,很多朋友都没有时间慢慢的研究代码,这里大家稍微花10分钟看一下文章,看完后再花5分钟改一下代码,即可达到你们所要的效果. 当然 ...
- 在linux环境下搭建java web测试环境(非常详细!)
一.项目必备软件及基本思路 项目必备:虚拟机:VMware Workstation (已安装linux的 CentOS6.5版本) 项目:java web项目 (必须在本地部署编译后选择项目的webR ...
- requireJS基本配置相关
requireJS: (1)实现js文件的异步加载,避免页面失去响应: (2)管理模块之间的依赖性,便于代码的编写和维护. 加载: <script src="js/require.js ...
- matlab练习程序(模拟退火SA)
模拟退火首先从某个初始候选解开始,当温度大于0时执行循环. 在循环中,通过随机扰动产生一个新的解,然后求得新解和原解之间的能量差,如果差小于0,则采用新解作为当前解. 如果差大于0,则采用一个当前温度 ...
- Java web的安全约束--Basic验证
要进行basic验证是用户名/口令机制,当浏览器要访问受保护的资源时,服务器会要求一个用户名和口令,只有输入了合法的用户名和口令.服务器才发送资源.用户名和口令可以存储在安全域中.安全域是标识一个We ...
- 多线程(四)~数据操作的原子性,使用原子性操作AutomicInteger替换非原子性的i++的操作
这一章,我们要来验证volatile关键字不是原子性的,OK,还是用代码来说话. ①.线程类,操作i++ 500次 package com.multiThread.thread; publicclas ...