如何安装Snappy Ubuntu到树莓派上安装opencv

使用libcurl进行文件下载类项目开发(一)l;引言:;由于要在android手机测进行DM开发,其中最;Libcurl使用介绍:;四个关键函数:;1.curl_easy_init()初始化cur;2.curl_easy_setopt()各种设置;curl_easy_setopt(handler;3.curl_easy_perform()开始执;4.cur
使用libcurl进行文件下载类项目开发(一)libcurl简单使用介绍
由于要在android手机测进行DM开发, 其中最重要的就是FUMO和SCOMO下载, 下载使用的是linux开源库libcurl. 于是就把libcurl的使用研究了一遍, 有些心得, 并解决了一些网友的阻塞卡死问题, 于是jwisp将经验和方案分享给大家.
Libcurl使用介绍:
四个关键函数:
1. curl_easy_init()初始化curl环境, 新建curl对象, 返回对象句柄, 使用举例:
CURL *handler = curl_easy_init();
2. curl_easy_setopt() 各种设置, 包括URL设置等, 使用举例:
curl_easy_setopt(handler, CURLOPT_URL, “”), 其中中间的参数是设置的类别, 比较重要, 后面会列举说明.
3. curl_easy_perform()开始执行下载操作, 若下载失败会返回错误码. 例如: CURLcode code = curl_easy_perform(handler)
4. curl_easy_getinfo()得到各种下载信息, 包括下载文件名, 文件大小等, 此操作必须放在curl_easy_perform()之后执行才能得到正确的值.使用举例: long resultC
curl_easy_getinfo(handler, CURLINFO_RESPONSE_CODE, &resultCode);
中间的参数也在后面列举
必要的参数说明
curl_easy_setopt()参数:
CURLOPT_URL
设置目标URL地址
CURLOPT_HEADER 是否包含http头, 包含则设置为一个非0值
CURLOPT_NOBODY 如果你不需要http的body部分(除header头以外其他部分), 设置此项为一个非0值
CURLOPT_TIMETOU 设置一个超时时间, 若超过此时间perform会立即返回, 返回码为下载失败对应错误码, 单位秒. 注意此时间为从调用perform开始后的总的下载时间, 举例curl_easy_setopt(handler, CURLOPT_TIMEOUT, 30)
设置超时时间为30秒, 即下载必须在30秒内完成, 否则返回下载失败
CURLOPT_CONNECTIONTIMEOUT 连接超时时间, 单位秒. 这个参数在easy curl下载中基本没什么实用价值.
CURLOPT_RESUME_FROM_LARGE从什么位置开始下载, 断点续传主要使用此参数进行配置, 使用非常简单, 只需要传递一个字节偏移量即可, 例如
curl_easy_setopt(handler, CURLOPT_RESUME_FROM, 0), 表示从第0个字节开始下载, curl_easy_setopt(handler, CURLOPT_RESUME_FROM, 500), 从第500个字节开始下载
CURLOPT_RANGE 下载指定字节的文件块, 参数对应的值格式为X-Y, 例如curl_easy_setopt(handler, CURLOPT_RESUME_FROM, “500-999”), 下载从500个字节开始到999字节结束的文件块
CURLOPT_NOPROGRESS 如果不需要下载进度设置此项为一个非0值
CURLOPT_PROGRESSFUNCTION 设置回调的进度函数, 设置后, 会不断的调用进度函数, 并传递参数总大小和已下载大小给该函数
CURLOPT_PROGRESSDATA 设置传递给回调的进度函数的一个参数, 类型为字符串类型, 后面jwisp会举例说明
curl_easy_getinfo() 部分参数说明
CURLINFO_RESPONSE_CODE 得到perform的执行结果码
CURLINFO_CONTENT_LENGTH_DOWNLOAD 得到下载文件大小
下一节为大家介绍, 如何使用这些libcurl函数进行文件大小的获取, 下载进度显示和断点续传.
(二)使用libcurl实现获取目标文件大小,下载进度显示, 断点续传等功能
本节jwisp为大家举例说明如果使用上节介绍的函数和参数, 在使用libcurl的过程中, 如何获取下载目标文件的大小, 下载进度条, 断点续传等, 这些基本的函数, 将为jwisp在最后处理下载过程异常中断等问题提供支持.
1. 编写得到下载目标文件的大小的函数
long getDownloadFileLenth(const char *url){
long downloadFileLenth = 0; CURL *handle = curl_easy_init();
curl_easy_setopt(handle, CURLOPT_URL, url);
curl_easy_setopt(handle, CURLOPT_HEADER, 1);
//只需要header头
curl_easy_setopt(handle, CURLOPT_NOBODY, 1);
//不需要body
if (curl_easy_perform(handle) == CURLE_OK) {
curl_easy_getinfo(handle,CURLINFO_CONTENT_LENGTH_DOWNLOAD,&downloadFileLenth);
downloadFileLenth = -1;
return downloadFileL
2. 下载中回调自己写的得到下载进度值的函数
下载回调函数的原型应该为:
int progressFunc(const char* flag, double dtotal, double dnow, double ultotal, double ulnow);
a. 应该在外部声明一个远程下载文件大小的全局变量
double downloadFileLenth = 0;
为了断点续传, 还应该声明一个本地文件大小的全局变量
double localFileLenth = 0;
b. 编写一个得到进度值的函数getProgressValue()
int getProgressValue(const char* flag, double dt, double dn, double ult, double uln){
double showTotal, showN if (downloadFileLenth == 0){
showTotal = downloadFileL
if (localFileLenth == 0){
showNow = localFileLenth +
//然后就可以调用你自己的进度显示函数了, 这里假设已经有一个进度函数, 那么只需要传递当前下
载值和总下载值即可.
showProgressValue(showNow, showTotal);
c. 在下载中进行三个下载参数的设置
curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(handle, CURLOPT_PROGRESSFUNCTION, getProgressValue);
//设置回调的进度函数
curl_easy_setopt(handle, CURLOPT_PROGRESSDATA, “flag”);
//此设置对应上面的const char *flag localFileLenth = getLocalFileLenth(filePath); downloadFileLenth = getDownloadFileLenth(url);
3. 断点续传
用libcurl实现断点续传很简单, 只用两步即可实现, 一是要得到本地文件已下载的大小, 通过函数getLocalFileLenth()方法来得到, 二是设置CURLOPT_RESUME_FROM_LARGE参数的值为已下载本地文件大小.
得到本地文件大小的函数:
==========================================================================================
(三)Libcurl中使用curl_easy_perform阻塞, 遇到无信号卡死的完美解决方案
近来jwisp在做OMA-DM的android终端侧, 要实现的功能包括FUMO, SCOMO下载管理. 由于项目是基于funambol的开源代码, 在实现FUMO和SCOMO时, 使用了libcurl的库来实现下载服务测的指定文件, 下载后实现android固件升级或android应用下载安装功能, 最后将FUMO/SCOMO的下载安装结果上报给服务端.
下载流程比较简单, 使用curl_easy_perform即可实现完整的下载流程, 安装后, 使用OMA DM协议上报给平台侧.但是jwisp这里的需求还有两个异常情况需要处理:
1. 下载过程中, 遇手机突然掉电(操作:扣电池), android终端再次启动后应能恢复现场然后自动下载, 下载
方式为建议断点续传
2. 下载过程中信号中断, 中断时间在5分钟之内, 终端应尝试重新连接, 连接次数在3次以上. 重新连接
后建议使用断点续传方式继续下载.
但是在使用libcurl时, jwisp发现, curl_easy_perform是阻塞的方式进行下载的, curl_easy_perform执行后, 程序会在这里阻塞等待下载结束(成功结束或者失败结束).此时若正常下载一段时间后, 进行网络中断, curl_easy_perform并不会返回失败, 而是阻塞整个程序卡在这里, 此时即使网络连接重新恢复, curl_easy_perform也无法恢复继续下载, 导致整个程序出现”死机”状态.
但是若先断网, 然后进行curl_easy_perform的话, 会直接返回失败, 不会阻塞
在网上搜索后发现, 大家在网上遇到这个问题的很多, 但是解决方法很少, 下面jwisp就把网上建议的可以使long getLocalFileLenth(const char* localPath); 设置下载点如下即可:
curl_easy_setopt(handle, CURLOPT_RESUME_FROM_LARGE, getLocalFileLenth(localFile));
用的解决方法罗列:
1. 使用multi模式下载, 而不使用easy模式, 此方法的唯一好处就是multi并不会阻塞, 而是立即返回. 但是缺点是带来了问题, 其一就是需要自己去阻塞, 当我们需要返回时再返回, 其二还需要启动一个线程, 需要自己控制整个过程的节奏.
2. 在下载中, 另起一个线程, 若发现下载状态卡死(可以通过定期检查文件大小来实现), 则从外部中断下载线程. 此方法需另起线程, 而且直接中断线程, 会给整个程序带来不稳定.
在尝试使用网上的方法失败后, jwisp终于设计出了自己的方案, 并完美解决信号中断异常, 下载中掉电异常, 断点续传等问题. 并且此方案不需要启动任何另外的线程, 不需要手动进行阻塞, 在信号中断后, 恢复连接最快可在0.5秒内恢复下载.并且恢复下载方式全部为断点续传.
主要的设计思路如下, 下载过程中, 设置超时时间为30秒, 30秒后若下载未完成就重新连接进行下载(这个可解决卡死问题), 每次下载时进行判断, 若不是首次下载则获得当前已下载文件大小, 从该大小处进行续传, 若网络仍处于断开状态, 再次连接会立即返回失败, 此时让当前线程等待0.5秒后进行连接(这个可以解决瞬间恢复连接的问题), 连接次数不超过600次(这个用来保证5分钟后返回失败). 掉电需要在程序已启动时检查是否上次未下载完如果是, 则直接调用下载续传方法即可. 这样基本上所有的问题的流程就都能顺利走下来, 并且下载过程体验好, 可随时取消.
该方案主要通过两个函数来实现, 一个负责进行断点续传和基本设置, 并执行下载, 一个负责控制整个下载重试次数, 返回下载结果. 并且需要注意的是, 安装完成后, 应将相应的文件删除掉.
源代码在下一节
=====================================================================================
(四)使用Libcurl下载文件,解决无信号中断,下载中掉电恢复后断点续传问题的源代码
源代码附上:
//全局变量
bool resumeDownload =
long downloadFileLenth = 0;
//是否需要下载的标记位 //需要下载的总大小, 远程文件的大小
/*得到本地文件大小的函数, 若不是续传则返回0, 否则返回指定路径地址的文件大小*/
long getLocalFileLenth(const char* localPath){
if (!resumeDownload){
包含各类专业文献、生活休闲娱乐、幼儿教育、小学教育、中学教育、高等教育、各类资格考试、90libcurl使用easy模式阻塞卡死等问题的完美解决等内容。 
 libcurl 版本信息的截图: 使用 easy interface 首先...模式,因为被动模式可以方便的穿透防火墙,NAT 等问题...curl_easy_perform 会一直阻塞到数据传输完毕后返 ...  libcurl使用帮助_IT/计算机_专业资料。找使用libcurl,找了下别人的学习新的留在...若在设置上做了 READ 或 WRITE 等动作,在执行完后还可以用 curl_easy_get...  如果不涉及到 gzip 等一些压缩格式的下载,你完全可以用一个 string 去替代我的...libcurl使用easy模式阻塞... 8页 1下载券 libcurl教程 25页 1下载券 libcurl...  libcurl 版本信息的截图: 使用 easy interface 首先..., 因为被动模式可以方便的穿透防火墙,NAT 等问题。...curl_easy_perform 会一直阻塞到数据传输完毕后返回,...  libcurl 版本信息的截图: 使用 easy interface 首先...模式,因为被动模式可以方便的穿透防火墙,NAT 等问题...curl_easy_perform 会一直阻塞到数据传输完毕后返回,...  //curl.haxx.se/libcurl/c/curl_easy_setopt....模式,因为被动模式可以方便的穿透防火墙,NAT 等问题...curl_easy_perform 会一直阻塞到数据传输完毕后返回,...  ()函数完成传输任务 6.调用 curl_easy_cleanup()释放内存 二:重要函数 1、CURLcode curl_global_init(long flags);//初始化 libcurl 描述:这个函数只能用一次...  调用 curl_easy_cleanup()释放内存 在整过过程中设置 curl_easy_setopt()参数是最关键的,几乎所有的 libcurl 程 序都要使用它。 2.2 重要函数 1.CURLcode ...  libcurl 版本信息的 截图: 使用 easy interface ...日志记录、设置传输模式、选择 当前文件夹,最后下载...curl_easy_perform 会一直阻塞 到数据传输完毕后返回...curl开启出了问题,求大神指点_php吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:125,076贴子:
curl开启出了问题,求大神指点收藏
我开启了extension=php_curl.dll,也有php_curl.dll,也把php_curl.dll,libeay32.dll,ssleay32.dll复制到system32下了但是就是没有curl,求指点呀
上海php软件开发培训,汇道php培训,「大专以上」学员,0元入学,一周免费试听!上海php软件开发培训,汇道php教育培训,学成高薪就业,先就业,再付款!
网上的解决方法都试过了,还是不行
windows直接下载wamp集成环境
路径选对没
你看哈你有没有curl这个配置文件
把你PHP安装目录下的libssh2.dll复制到apache的bin目录下重启APACHE服务就可以了
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或cURL FOLLOWLOCATION 错误解决 - 雪箭微薄
欢迎来到雪箭微薄 !
& cURL FOLLOWLOCATION 错误解决
围观:1,031 次
cURL FOLLOWLOCATION 错误解决
Publish:12月25日08:54
经过近一个星期的时间,雪箭采集器终于开完完毕,在用户的服务器中测试遇到一个cURL的问题:
Warning: curl_setopt(): CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/wwwroot/default/wp-content/themes/hdp3.1.1/extends/fetch-multi-e-malls/class/FetchURL.class.php on line 54
神翻译别吐槽:“当开启php安全模式或设置了open_basedir的时候cURL链接转向功能不能被激活”。
这里面涉及到一个关键词叫链接转向,简单的说就是采集的目标页出现301/302状态跳转链接时,允许程序自动追踪采集。可是用户的阿里云服务器不好使怎么办呢?关闭服务器安全模式或去掉掉open_basedir设置,应该可行,不过要用户修改服务器配置,可不是一劳永逸的事情,有没有能够通过修改程序来解决问题的方法呢?
没问题,Follow me…
方法一,自欺欺人法,关闭cURL中的自动转向功能,将设置中 CURLOPT_FOLLOWLOCATION 中的值修改为0,或直接删除该设置。
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 参数 1 也可能是 true
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0); // 改成0,或将前句删除
如此一来程序便不再报之前的错误咯,问题也看似解决了。对于一般程序而言这种方法就可以解决了,但是对于采集程序来说,关闭了转向功能很多数据可能就采集不到了。
方法二,完美解决法。经过一翻周折雪箭在外文站点中找到一个代替函数,内部参数设置可酌情修改。经测试用户站点中也是完美支持的说。
function geturl($url){
(function_exists('curl_init')) ? '' : die('cURL Must be installed for geturl function to work. Ask your host to enable it or uncomment extension=php_curl.dll in php.ini');
$curl = curl_init();
$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$header[0] .= "text/q=0.9,text/q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,q=0.5";
$header[] = "Pragma: ";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/ Firefox/5.0 Firefox/5.0');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_REFERER, $url);
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); //CURLOPT_FOLLOWLOCATION Disabled...
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
$html = curl_exec($curl);
$status = curl_getinfo($curl);
curl_close($curl);
if($status['http_code']!=200){
if($status['http_code'] == 301 || $status['http_code'] == 302) {
list($header) = explode("\r\n\r\n", $html, 2);
$matches = array();
preg_match("/(Location:|URI:)[^(\n)]*/", $header, $matches);
$url = trim(str_replace($matches[1],"",$matches[0]));
$url_parsed = parse_url($url);
return (isset($url_parsed))? geturl($url):'';
$oline='';
foreach($status as $key=&$eline){$oline.='['.$key.']'.$eline.' ';}
$line =$oline." \r\n ".$url."\r\n-----------------\r\n";
$handle = @fopen('./curl.error.log', 'a');
fwrite($handle, $line);
return FALSE;
百度这货知识渊博,就像一部百科全书,百度一下常见的问题都能为你解决,但是遇到一些学识上的专业性的问题,它就可能一筹莫展了。此时,你不妨谷歌一下,你会发现天空似乎豁然开朗。
扩展阅读:/questions/6918623/curlopt-followlocation-cannot-be-activated
签名:要优雅,不要污,哇嘎嘎。
你可能还会喜欢的文章:
三种方法修改PHP内存上限
我能说SAE国内线路也不太稳定吗
少年,你没有权限查看此内容
PHP数据类型Curl使用问题 - 推酷
Curl使用问题
在进行网页抓取和模拟登陆的开发,curl必须是首选的工具,由于它强大的功能,也提供了多个平台的支持。最近使用curl进行模拟登陆https网站,遇到了一些问题,问题的真相真是不好找,因为本身对网络方面的东西也不太熟悉,后来经过调试,还是找到原因了。
curl下载:http://curl.haxx.se/download.html
官网提供了多个平台的软件和动态库的下载,这里我使用Qt开发,所以使用了Windows平台下的mingw编译版本:http://curl.haxx.se/gknw.net/7.28.1/dist-w32/curl-7.28.1-devel-mingw32.zip
解压出来,可以看到include、lib、bin等目录,编译的时候,使用bin目录下的dll动态库,包含include头文件,即可完成编译和使用。该版本支持ssl,可以访问https的网站。
另外帮助文档的问题,可以下载curl源码,里面就有提供完整的文档,很详细,如果要使用curl开发,使用里面的文档已经非常清楚。
我遇到以下几个问题:
1.curl登陆https网站失败(最终确认是url编码与socket长连接的问题。)
2.获取的网页源码与浏览器访问的源码有点区别
登陆https网站,在不使用证书的情况下,要设置:
curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYPEER, 0L);
curl抓取的网页代码与浏览器打开的不一致,这主要是user-agent的设置问题,如果一定要使用浏览器的格式,那么可以直接将某个浏览器的user-agent的值拿来使用,这样就模仿浏览器访问网页了。我这里使用的是火狐浏览器的user-agent:
curl_easy_setopt(m_pCurl, CURLOPT_USERAGENT, &Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/ Firefox/17.0&);
如果是post操作,那么提交的的表单域要转换成url编码,有些人不熟悉url编码,其实只是把某些特殊的字符转换成通用的格式。
比如:'='转换成&%3D&
如果函数库没有提供,可以自己根据url编码表写一个转换函数。
用户可以在curl默认的http头添加或修改自己想要的选项,我这里要添加长连接选项:Connection: keep-alive:
struct curl_slist *
list = curl_slist_append(list, &Connection: keep-alive&);
curl_easy_setopt(m_pCurl, CURLOPT_HTTPHEADER, list);
设置到CURLOPT_HTTPHEADER中,即可添加进去。
在curl遇到奇怪的问题,最好要打开调试选项,而且可以结合火狐浏览器的httpfox插件
curl_easy_setopt(m_pCurl, CURLOPT_DEBUGFUNCTION, CurlDebug);//打印完整的调试信息
curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, 1);//打印调试信息
在这里分享一个现成的curl的post操作:
bool CCurl::Post(const QString &actionUrl, const QString &fieldsInfo, QString &htmlStr)
struct curl_slist *
list = curl_slist_append(list, &Connection: keep-alive&);
curl_easy_setopt(m_pCurl, CURLOPT_URL, actionUrl.toLatin1().data());
curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(m_pCurl, CURLOPT_COOKIEJAR, m_CookiesFileName.toAscii().data());
curl_easy_setopt(m_pCurl, CURLOPT_COOKIEFILE, m_CookiesFileName.toAscii().data());
curl_easy_setopt(m_pCurl, CURLOPT_WRITEFUNCTION, WriteToMem);
curl_easy_setopt(m_pCurl, CURLOPT_WRITEDATA, &htmlStr);
curl_easy_setopt(m_pCurl, CURLOPT_POSTFIELDS, fieldsInfo.toLatin1().data());
curl_easy_setopt(m_pCurl, CURLOPT_POST, 1L);
curl_easy_setopt(m_pCurl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(m_pCurl, CURLOPT_HTTPHEADER, list);
curl_easy_setopt(m_pCurl, CURLOPT_USERAGENT, &Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/ Firefox/17.0&);
//curl_easy_setopt(m_pCurl, CURLOPT_DEBUGFUNCTION, CurlDebug);//打印完整的调试信息
//curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, 1);//打印调试信息
code = curl_easy_perform(m_pCurl);
if (CURLE_OK != code)
qDebug() && &curl_easy_perform: & && curl_easy_strerror(code);
curl_slist_free_all(list);
curl_slist_free_all(list);
调试函数可以这么写,这是在网上找到的:
int CCurl::CurlDebug(CURL *pcurl, curl_infotype itype, char * pData, size_t size, void *)
if(itype == CURLINFO_TEXT)
qDebug() && &[TEXT]:& && pD
else if(itype == CURLINFO_HEADER_IN)
qDebug() && &[HEADER_IN]:& && pD
else if(itype == CURLINFO_HEADER_OUT)
qDebug() && &[HEADER_OUT]:& && pD
else if(itype == CURLINFO_DATA_IN)
qDebug() && &[DATA_IN]:& && pD
else if(itype == CURLINFO_DATA_OUT)
qDebug() && &[DATA_OUT]:& && pD
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 树莓派上安装noobs 的文章

 

随机推荐