学习&使用-libcurl

学习 & 使用 libcurl

想用 C 写一个 httpclient,作为一个子模块,以后读取一个 web 的配置文件,etcd 的数据等等,都很方便。但是自己用 tcp socket 来写的话比较麻烦,需要自己写 GET 或者 POST 请求,然后解析响应,虽然不是特别麻烦,但是用开源库的话会更简单。搜索了一下,libcurl 是非常符合我的需求的。

简介

libcurl主要功能就是用不同的协议连接和沟通不同的服务器。 libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证。

curl is an open source command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, HTTP/2, cookies, user+password authentication (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos), file transfer resume, proxy tunneling and more.

安装

在 Debian 安装使用,直接安装 libcurl-dev不成功,按照提示,安装了 libcurl4-openssl-dev

root@kali:~# apt-get install libcurl-dev
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
Package libcurl-dev is a virtual package provided by:
  libcurl4-openssl-dev 7.38.0-4+deb8u2
  libcurl4-nss-dev 7.38.0-4+deb8u2
  libcurl4-gnutls-dev 7.38.0-4+deb8u2
You should explicitly select one to install.

E: Package 'libcurl-dev' has no installation candidate
root@kali:~# apt-get install libcurl4-openssl-dev

在 Centos中,直接使用 sudo yum install libcurl-devel 就可以了。
另外也可以源码安装,最好还是把源码下载下来,看一看里面的示例。
源码下载地址:https://curl.haxx.se/

使用

越简单越好,我想要的功能只是下载指定 url 的数据。在源码中的 docs/examples/url2file.c 感觉挺符合我的要求的。

先上代码(编译的时候注意使用 -lcurl 来连接 libcurl库):

/* 
 * Download a given URL into a local file named page.out.
 * 
 */
#include 
#include 
#include 

#include 

static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
  size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
  return written;
}

int main(int argc, char *argv[])
{
  CURL *curl_handle;
  static const char *pagefilename = "page.out";
  FILE *pagefile;

  if(argc < 2 ) {
    printf("Usage: %s \n", argv[0]);
    return 1;
  }

  curl_global_init(CURL_GLOBAL_ALL);

  /* init the curl session */
  curl_handle = curl_easy_init();

  /* set URL to get here */
  curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]);

  /* Switch on full protocol/debug output while testing */
  curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);

  /* disable progress meter, set to 0L to enable and disable debug output */
  curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);

  /* send all data to this function  */
  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);

  /* open the file */
  pagefile = fopen(pagefilename, "wb");
  if (pagefile) {

    /* write the page body to this file handle */
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile);

    /* get it! */
    curl_easy_perform(curl_handle);

    /* close the header file */
    fclose(pagefile);
  }

  /* cleanup curl stuff */
  curl_easy_cleanup(curl_handle);

  return 0;
}

其实代码挺简单,注释也比较全,还是解释一下备忘吧。
代码的功能就是下载指定的网页存储到 page.out
libcurl的使用方法分为5步

  1. 全局初始化 libcurl
  2. 获取一个 curl handle
  3. 设置 curl 各种属性,比如 要访问的 url 地址
  4. 执行
  5. 清理

这些步骤分别对应了下面5个函数

  1. curl_global_init
  2. curl_easy_init
  3. curl_easy_setopt
  4. curl_easy_perform
  5. curl_easy_cleanup

所以,要想 libcurl 按照我的意图去执行,那就需要使用 curl_easy_setopt 来配置 curl。
回头看代码
curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]); 这一句配置了要访问的 url

curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L); 这一句配置要显示一些执行信息

root@kali:~# ./a.out www.baidu.com
* Rebuilt URL to: www.baidu.com/
* Hostname was NOT found in DNS cache
*   Trying 220.181.112.244...
* Connected to www.baidu.com (220.181.112.244) port 80 (#0)
> GET / HTTP/1.1
Host: www.baidu.com
Accept: */*

< HTTP/1.1 200 OK
< Via: 1.1 TMG1
< Connection: Keep-Alive
< Proxy-Connection: Keep-Alive
< Content-Length: 14613
< Date: Fri, 04 Mar 2016 07:07:03 GMT
< Content-Type: text/html
* Server BWS/1.1 is not blacklisted
< Server: BWS/1.1
< Accept-Ranges: bytes
< Last-Modified: Wed, 03 Sep 2014 02:48:32 GMT
< Vary: Accept-Encoding
< Set-Cookie: BAIDUID=430A14E68C684914E22A8D85CB805A2F:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
< Set-Cookie: BIDUPSID=430A14E68C684914E22A8D85CB805A2F; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
< Set-Cookie: PSTM=1457075223; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
< Set-Cookie: BDSVRTM=0; path=/
< P3P: CP=" OTI DSP COR IVA OUR IND COM "
< X-UA-Compatible: IE=Edge,chrome=1
< Pragma: no-cache
< Cache-control: no-cache
< BDPAGETYPE: 1
< BDQID: 0xcda7ec93000485b3
< BDUSERID: 0
< 
* Connection #0 to host www.baidu.com left intact

以上就是 stdout 的输出啦,注释掉上面那一句配置语句,就没有这些输出了。

curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L); 这句话的意思是说不显示进度,如果把1L 修改为0L,那么就会有下面的输出

root@kali:~# ./a.out www.baidu.com
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 14613  100 14613    0     0  72012      0 --:--:-- --:--:-- --:--:-- 72341

curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data); 这句话定义了收到数据的回调函数是 write_data

curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile); 这句话定义了回调函数的参数中的那个文件句柄。这个文件句柄现在看不懂没关系,这个pagefile文件句柄,会作为回调函数的参数。

下面就看这个回调函数

static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
  size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
  return written;
}
  • ptr: 这个是数据的 buff
  • size: 数据长度
  • nmemb: 数据块个数
  • stream: 就是你设置的 pagefile 句柄啦

把回调函数修改为下面这个样子,就可以确定这些参数的意思啦

static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
  printf("size_t:%d\nnmemb: %d\nlen: %d\nstream:%s\n",size, nmemb, strlen((char*)ptr),(char*)ptr);
  size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
  return written;
}

输出是这样子的

root@kali:~# ./a.out www.baidu.com
size_t:1
nmemb: 4200
len: 4200
stream:
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <link rel="dns-prefetch" href="//s1.bdstatic.com"/>
    <link rel="dns-prefetch" href="//t1.baidu.com"/>
    <link rel="dns-prefetch" href="//t2.baidu.com"/>
    <link rel="dns-prefetch" href="//t3.baidu.com"/>
    <link rel="dns-prefetch" href="//t10.baidu.com"/>
    <link rel="dns-prefetch" href="//t11.baidu.com"/>
    <link rel="dns-prefetch" href="//t12.baidu.com"/>
    <link rel="dns-prefetch" href="//b1.bdstatic.com"/>
    <title>百度一下,你就知道title>
    <link href="http://s1.bdstatic.com/r/www/cache/static/home/css/index.css" rel="stylesheet" type="text/css" />
    
    
    <script>var hashMatch = document.location.href.match(/#+(.*wd=[^&].+)/);if (hashMatch && hashMatch[0] && hashMatch[1]) {document.location.replace("http://"+location.host+"/s?"+hashMatch[1]);}var ns_c = function(){};script>
    <script>function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('//www.baidu.com/');}script>
    <noscript><meta http-equiv="refresh" content="0; url=/baidu.html?from=noscript"/>noscript>
    <script>window._ASYNC_START=new Date().getTime();script>
head>
<body link="#0000cc"><div id="wrapper" style="display:none;"><div id="u"><a href="//www.baidu.com/gaoji/preferences.html"  onmousedown="return user_c({'fm':'set','tab':'setting','login':'0'})">搜索设置a>|<a id="btop" href="/"  onmousedown="return user_c({'fm':'set','tab':'index','login':'0'})">百度首页a>|<a id="lb" href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" onclick="return false;"  onmousedown="return user_c({'fm':'set','tab':'login'})">登录a><a href="https://passport.baidu.com/v2/?reg®Type=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F"  onmousedown="return user_c({'fm':'set','tab':'reg'})" target="_blank" class="reg">注册a>div><div id="head"><div class="s_nav"><a href="/" class="s_logo" onmousedown="return c({'fm':'tab','tab':'logo'})"><img src="//www.baidu.com/img/baidu_jgylogo3.gif" width="117" height="38" border="0" alt="到百度首页" title="到百度首页">a><div class="s_tab" id="s_tab"><a href="http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'news'})">新闻a> <b>网页b> <a href="http://tieba.baidu.com/f?kw=&fr=wwwt" wdfield="kw"  onmousedown="return c({'fm':'tab','tab':'tieba'})">贴吧a> <a href="http://zhidao.baidu.com/q?ct=17&pn=0&tn=ikaslist&rn=10&word=&fr=wwwt" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'zhidao'})">知道a> <a href="http://music.baidu.com/search?fr=ps&key=" wdfield="key"  onmousedown="return c({'fm':'tab','tab':'music'})">音乐a> <a href="http://image.baidu.com/i?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&word=" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'pic'})">图片a> <a href="http://v.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=25&word=" wdfield="word"   onmousedown="return c({'fm':'tab','tab':'video'})">视频a> <a href="http://map.baidu.com/m?word=&fr=ps01000" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'map'})">地图a> <a href="http://wenku.baidu.com/search?word=&lm=0&od=0" wdfield="word"  onmousedown="return c({'fm':'tab','tab':'wenku'})">文库a> <a href="//www.baidu.com/more/"  onmousedown="return c({'fm':'tab','tab':'more'})">更多»a>div>div><form id="form" name="f" action="/s" class="fm" ><input type="hidden" name="ie" value="utf-8"><input type="hidden" name="f" value="8"><input type="hidden" name="rsv_bp" value="1"><span class="bg s_ipt_wr"><input name="wd" id="kw" class="s_ipt" value="" maxlength="100">span><span class="bg s_btn_wr"><input type="submit" id="su" value="百度一下" class="bg s_btn" onmousedown="this.className='bg s_btn s_btn_h'" onmouseout="this.className='bg 
size_t:1
nmemb: 1400
len: 1400
stream:s_btn'">span><span class="tools"><span id="mHolder"><div id="mCon"><span>输入法span>div><ul id="mMenu"><li><a href="javascript:;" name="ime_hw">手写a>li><li><a href="javascript:;" name="ime_py">拼音a>li><li class="ln">li><li><a href="javascript:;" name="ime_cl">关闭a>li>ul>span><span class="shouji"><strong>推荐 : strong><a href="http://w.x.baidu.com/go/mini/8/10000020" onmousedown="return ns_c({'fm':'behs','tab':'bdbrowser'})">百度浏览器,打开网页快2秒!a>span>span>form>div><div id="content"><div id="u1"><a href="http://news.baidu.com" name="tj_trnews" class="mnav">新闻a><a href="http://www.hao123.com" name="tj_trhao123" class="mnav">hao123a><a href="http://map.baidu.com" name="tj_trmap" class="mnav">地图a><a href="http://v.baidu.com" name="tj_trvideo" class="mnav">视频a><a href="http://tieba.baidu.com" name="tj_trtieba" class="mnav">贴吧a><a href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" name="tj_login" id="lb" onclick="return false;">登录a><a href="//www.baidu.com/gaoji/preferences.html" name="tj_settingicon" id="pf">设置a><a href="//www.baidu.com/more/" name="tj_briicon" id="bri">更多产品a>div><div id="m"><p id="lg"><img src="//www.baidu.com/img/bd_logo.png" width="270" height="129">p><p id="nv"><a href="http://news.baidu.com">新 
size_t:1
nmemb: 1400
len: 1400
stream:;闻a> <b>网 页b> <a href="http://tieba.baidu.com">贴 吧a> <a href="http://zhidao.baidu.com">知 道a> <a href="http://music.baidu.com">音 乐a> <a href="http://image.baidu.com">图 片a> <a href="http://v.baidu.com">视 频a> <a href="http://map.baidu.com">地 图a>p><div id="fm"><form id="form1" name="f1" action="/s" class="fm"><span class="bg s_ipt_wr"><input type="text" name="wd" id="kw1" maxlength="100" class="s_ipt">span><input type="hidden" name="rsv_bp" value="0"><input type=hidden name=ch value=""><input type=hidden name=tn value="baidu"><input type=hidden name=bar value=""><input type="hidden" name="rsv_spt" value="3"><input type="hidden" name="ie" value="utf-8"><span class="bg s_btn_wr"><input type="submit" value="百度一下" id="su1" class="bg s_btn" onmousedown="this.className='bg s_btn s_btn_h'" onmouseout="this.className='bg s_btn'">span>form><span class="tools"><span id="mHolder1"><div id="mCon1"><span>输入法span>div>span>span><ul id="mMenu1"><div class="mMenu1-tip-arrow"><em>em><ins>ins>div><li><a href="javascript:;" name="ime_hw">手写a>li><li><a href="javascript:;" name="ime_py">拼音a>li><li class="ln">li><li><a href="javascript:;" name="ime_cl">关闭a>li>ul>div><p id="lk"><a href="http://baike.baidu.com">百科a> <a href="http://wenku.ba
size_t:1
nmemb: 1400
len: 1400
stream:idu.com">文库a> <a href="http://www.hao123.com">hao123a><span> | <a href="//www.baidu.com/more/">更多>>a>span>p><p id="lm">p>div>div><div id="ftCon"><div id="ftConw"><p id="lh"><a id="seth" onClick="h(this)" href="/" onmousedown="return ns_c({'fm':'behs','tab':'homepage','pos':0})">把百度设为主页a><a id="setf" href="//www.baidu.com/cache/sethelp/index.html" onmousedown="return ns_c({'fm':'behs','tab':'favorites','pos':0})" target="_blank">把百度设为主页a><a onmousedown="return ns_c({'fm':'behs','tab':'tj_about'})" href="http://home.baidu.com">关于百度a><a onmousedown="return ns_c({'fm':'behs','tab':'tj_about_en'})" href="http://ir.baidu.com">About Baidua>p><p id="cp">©2014 Baidu <a href="/duty/" name="tj_duty">使用百度前必读a> 京ICP证030173号 <img src="http://s1.bdstatic.com/r/www/cache/static/global/img/gs_237f015b.gif">p>div>div><div id="wrapper_wrapper">div>div><div class="c-tips-container" id="c-tips-container">div>
<script>window.__async_strategy=2;script>
<script>var bds={se:{},su:{urdata:[],urSendClick:function(){}},util:{},use:{},comm : {domain:"http://www.baidu.com",ubsurl : "http://sclick.baidu.com/w.gif",tn:"baidu",queryEnc:"",queryId:"",inter:"",templateName:"baidu",sugHost : "http://suggestion.baidu.com/su",query : "",qid : "",cid : "",sid : "",ind
size_t:1
nmemb: 1400
len: 1400
stream:exSid : "",stoken : "",serverTime : "",user : "",username : "",loginAction : [],useFavo : "",pinyin : "",favoOn : "",curResultNum:"",rightResultExist:false,protectNum:0,zxlNum:0,pageNum:1,pageSize:10,newindex:0,async:1,maxPreloadThread:5,maxPreloadTimes:10,preloadMouseMoveDistance:5,switchAddMask:false,isDebug:false,ishome : 1},_base64:{domain : "http://b1.bdstatic.com/",b64Exp : -1,pdc : 0}};var name,navigate,al_arr=[];var selfOpen = window.open;eval("var open = selfOpen;");var isIE=navigator.userAgent.indexOf("MSIE")!=-1&&!window.opera;var E = bds.ecom= {};bds.se.mon = {'loadedItems':[],'load':function(){},'srvt':-1};try {bds.se.mon.srvt = parseInt(document.cookie.match(new RegExp("(^| )BDSVRTM=([^;]*)(;|$)"))[2]);document.cookie="BDSVRTM=;expires=Sat, 01 Jan 2000 00:00:00 GMT"; }catch(e){}script>
<script>if(!location.hash.match(/[^a-zA-Z0-9]wd=/)){document.getElementById("ftCon").style.display='block';document.getElementById("u1").style.display='block';document.getElementById("content").style.display='block';document.getElementById("wrapper").style.display='block';setTimeout(function(){try{document.getElementById("kw1").focus();document.getElementById("kw1").parentNode.className += ' iptfocus';}catch(e){}},0);}script>
<script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/static/jquery/jquery-1.10.2.min_f2fb5194.js">script>
<script>(function(){var in
size_t:1
nmemb: 1400
len: 1400
stream:dex_content = $('#content');var index_foot= $('#ftCon');var index_css= $('head [index]');var index_u= $('#u1');var result_u= $('#u');var wrapper=$("#wrapper");window.index_on=function(){index_css.insertAfter("meta:eq(0)");result_common_css.remove();result_aladdin_css.remove();result_sug_css.remove();index_content.show();index_foot.show();index_u.show();result_u.hide();wrapper.show();if(bds.su&&bds.su.U&&bds.su.U.homeInit){bds.su.U.homeInit();}setTimeout(function(){try{$('#kw1').get(0).focus();window.sugIndex.start();}catch(e){}},0);if(typeof initIndex=='function'){initIndex();}};window.index_off=function(){index_css.remove();index_content.hide();index_foot.hide();index_u.hide();result_u.show();result_aladdin_css.insertAfter("meta:eq(0)");result_common_css.insertAfter("meta:eq(0)");result_sug_css.insertAfter("meta:eq(0)");wrapper.show();};})();script>
<script>window.__switch_add_mask=1;script>
<script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/static/global/js/instant_search_newi_redirect1_20bf4036.js">script>
<script>initPreload();$("#u,#u1").delegate("#lb",'click',function(){try{bds.se.login.open();}catch(e){}});if(navigator.cookieEnabled){document.cookie="NOJS=;expires=Sat, 01 Jan 2000 00:00:00 GMT";}script>
<script>$(function(){for(i=0;i<3;i++){u($($('.s_ipt_wr')[i]),$($('.s_ipt')[i]),$($('.s_btn_wr')[i]),$($('.s_btn')[i]));}function u(iptwr,i
size_t:1
nmemb: 1400
len: 1400
stream:pt,btnwr,btn){if(iptwr && ipt){iptwr.on('mouseover',function(){iptwr.addClass('ipthover');}).on('mouseout',function(){iptwr.removeClass('ipthover');}).on('click',function(){ipt.focus();});ipt.on('focus',function(){iptwr.addClass('iptfocus');}).on('blur',function(){iptwr.removeClass('iptfocus');}).on('render',function(e){var $s = iptwr.parent().find('.bdsug');var l = $s.find('li').length;if(l>=5){$s.addClass('bdsugbg');}else{$s.removeClass('bdsugbg');}});}if(btnwr && btn){btnwr.on('mouseover',function(){btn.addClass('btnhover');}).on('mouseout',function(){btn.removeClass('btnhover');});}}});script>
<script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/static/home/js/bri_7f1fa703.js">script>
<script>(function(){var _init=false;window.initIndex=function(){if(_init){return;}_init=true;var w=window,d=document,n=navigator,k=d.f1.wd,a=d.getElementById("nv").getElementsByTagName("a"),isIE=n.userAgent.indexOf("MSIE")!=-1&&!window.opera;(function(){if(/q=([^&]+)/.test(location.search)){k.value=decodeURIComponent(RegExp["\x241"])}})();(function(){var u = G("u1").getElementsByTagName("a"), nv = G("nv").getElementsByTagName("a"), lk = G("lk").getElementsByTagName("a"), un = "";var tj_nv = ["news","tieba","zhidao","mp3","img","video","map"];var tj_lk = ["baike","wenku","hao123","more"];un = bds.comm.user == "" ? "" : bds.comm.user;function _addTJ(obj){addEV(obj, "mouse
size_t:1
nmemb: 2013
len: 2013
stream:down", function(e){var e = e || window.event;var target = e.target || e.srcElement;if(target.name){ns_c({'fm':'behs','tab':target.name,'un':encodeURIComponent(un)});}});}for(var i = 0; i < u.length; i++){_addTJ(u[i]);}for(var i = 0; i < nv.length; i++){nv[i].name = 'tj_' + tj_nv[i];}for(var i = 0; i < lk.length; i++){lk[i].name = 'tj_' + tj_lk[i];}})();(function() {var links = {'tj_news': ['word', 'http://news.baidu.com/ns?tn=news&cl=2&rn=20&ct=1&ie=utf-8'],'tj_tieba': ['kw', 'http://tieba.baidu.com/f?ie=utf-8'],'tj_zhidao': ['word', 'http://zhidao.baidu.com/search?pn=0&rn=10&lm=0'],'tj_mp3': ['key', 'http://music.baidu.com/search?fr=ps&ie=utf-8'],'tj_img': ['word', 'http://image.baidu.com/i?ct=201326592&cl=2&nc=1&lm=-1&st=-1&tn=baiduimage&istype=2&fm=&pv=&z=0&ie=utf-8'],'tj_video': ['word', 'http://video.baidu.com/v?ct=301989888&s=25&ie=utf-8'],'tj_map': ['wd', 'http://map.baidu.com/?newmap=1&ie=utf-8&s=s'],'tj_baike': ['word', 'http://baike.baidu.com/search/word?pic=1&sug=1&enc=utf8'],'tj_wenku': ['word', 'http://wenku.baidu.com/search?ie=utf-8']};var domArr = [G('nv'), G('lk'),G('cp')],kw = G('kw1');for (var i = 0, l = domArr.length; i < l; i++) {domArr[i].onmousedown = function(e) {e = e || window.event;var target = e.target || e.srcElement,name = target.getAttribute('name'),items = links[name],reg = new RegExp('^\\s+|\\s+\x24'),key = kw.value.replace(reg, '');if (items) {if (key.length > 0) {var wd = items[0], url = items[1],url = url + ( name === 'tj_map' ? encodeURIComponent('&' + wd + '=' + key) : ( ( url.indexOf('?') > 0 ? '&' : '?' ) + wd + '=' + encodeURIComponent(key) ) );target.href = url;} else {target.href = target.href.match(new RegExp('^http:\/\/.+\.baidu\.com'))[0];}}name && ns_c({'fm': 'behs','tab': name,'query': encodeURIComponent(key),'un': encodeURIComponent(bds.comm.user || '') });};}})();};if(window.pageState==0){initIndex();}})();document.cookie = 'IS_STATIC=1;expires=' + new Date(new Date().getTime() + 10*60*1000).toGMTString();script>
body>html>

应用

知道了回调函数各个参数的意思,修改回调函数就能实现我们自己需要的功能了。示例里面的getinmemory.c也不错

真的要认真的使用的话,还是读官方文档https://curl.haxx.se/libcurl/c/,不要看博客,博客内容是博主的理解,不一定对,且不全面。比如本博客,只是我随便看看的结果,项目中要用,代码肯定要修改很多。

你可能感兴趣的:(linux,C++)