最近想把某网站上的些数据download下来,在网上找到了cURL,正好来边学边弄一下!

  

下载libcurl源代码


cURL的官网是http://curl.haxx.se/ ,直接下载源代码包来编译吧 ,在download里面有源代码下在,最新版是curl-7.32.0(http://curl.haxx.se/download/curl-7.32.0.tar.gz)。

MinGw下编译libcurl


  1. 解压文件。
  2. 通过命令行进入到curl-7.32.0目录下。
  3. 键入 mingw32-make mingw32 编译生成。

libcurl的使用


libcurl是开源的url传输库,支持 FTP、HTTP等协议。我用C语言来实现。curl的接口有很多,目前libcurl-easy接口的功能就足够强大,够完成我的要求了,所以这里就研究下libcurl-easy里的函数就行了,其他的以后用到在研究。

一般curl的使用流程:

 curl_easy_init();        //初始化curl对象
curl_easy_setopt(); //设置curl对象的行为
curl_easy_perform(); //执行操作
curl_easy_cleanu p(); //关闭curl

<culr/curl.h>中的部分函数:

、 CURLcode curl_global_init(long flags);

该函数必须在调用其他curl函数之前调用。只需调用一次,调用多次和一次一样。

该函数是非线程安全的,所以不可以在它运行时,在其他线程调用它。

如果在使用curl_easy_init()函数之前未调用curl_global_init()函数,程序将自动调用。

参数:

CURL_GLOBAL_ALL   初始化除CURL_GLOBAL_ACK_EINTR外的所有系统。

CURL_GLOBAL_SSL   初始化SSL

CURL_GLOBAL_WIN32   初始化Win32 socket libraries.

CURL_GLOBAL_NOTHING   不初始化任何系统

CURL_GLOBAL_DEFAULT   等同于CURL_GLOBAL_ALL

CURL_GLOBAL_ACK_EINTR   设置了这个标签后,当curl在连接或等待数据请求时,curl将接收EINTR条件,否则,curl会一直等待。

返回值:

正常通过时返回0,非零值表示出现错误。

、void curl_global_cleanup(void);

该函数释放由curl_global_init()函数请求的资源。

该函数必须在curl_global_init()函数之后调用,关闭curl库之前必须调用。

该函数也是非线程安全的。

 

、CURL *curl_easy_init( );

该函数初始化生成一个curl的指针,该指针用做其他easy函数的输入。

该函数必须和curl_easy_clean()函数一起使用。

如果在调用该函数之前,你没有调用curl_global_init()进行初始化,系统将会自动调用curl_global_init()函数。

但建议你最好不用让系统自动调用该函数,因为可能会忘了调用curl_global_cleanup(),而出现问题。

所以最好手动调用curl_global_init()函数。

返回值:

返回一类似FILE的指针,如果返回NULL,则发生错误。

、void curl_easy_cleanup(CURL * handle );

调用该函数来结束一个curl easy会话。关闭一个由curl_easy_init()生成的handle

、CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);

为“easy”句柄设置一个行为。

curl_easy_setopt()函数告诉libcurl该如何做。通过设置适当的参数,你可以改变libcurl的行为。

基本所有的操作都是通过这个函数设置的。

option参数是一系列的行为操作。

parameter取决于option参数的设置。

返回值:

0或CURL_OK表示成功。非零值表示有错误发生。

如果你设置了一个libcurl无法识别的行为,可能是libcurl版本过低,则将会返回 CURLE_FAILED_INIT。

、CURLcode curl_easy_perform(CURL * handle);

执行会话的操作。

该函数在curl_easy_init()函数和所有的curl_easy_setopt()函数设置完后调用,执行所有设置的操作。

返回值:

成功则返回0,返回non-zero则失败。如果在curl_easy_setopt()函数中设置了 CURLOPT_ERRORBUFFER ,则当返回non-zero时,在error buffer中会有可读的错误信息。

、CURL *curl_easy_duphandle(CURL *handle);

克隆一个curl会话句柄。

该函数将返回一个curl副本,拥有之前句柄的所有设置。

新的curl句柄也必须在关闭时调用curl_easy_cleanup()函数。

新生成的副本不会继承任何状态信息,没有连接,没有SSL,没有cookies。

返回值:

如果返回NULL,则表示克隆失败。

、char *curl_easy_escape( CURL * curl , char * url , int length);

URL编码给定的字符串。

该程序将输入的字符串转化为一个URL编码字符串,返回一个新生成的字符串。

除了a-z, A-Z, 0-9, '-', '.', '_' or '~'字符外,其他字符都转为转义字符形式。

如果length参数设为0,将自动调用strlen()函数计算url的长度作为参数。

必须用curl_free()函数来释放字符串内存。

返回值:

一个指向字符串结尾的指针或者NULL表示转化失败。

、char *curl_easy_unescape( CURL * curl , char * url , int inlength , int * outlength);

URL解码给定的字符串。

所有输入的URL编码都转化成他们相对应的二进制码。

如果inlength参数设为0,将自动调用strlen()函数计算url的长度作为参数。

如果outlength参数为non-NULL,函数将写入返回字符串的长度。

返回值:

一个指向字符串结尾的指针或者NULL表示转化失败。

、CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);

用来获取curl句柄的信息。

、CURLcode curl_easy_pause(CURL *handle , int bitmask);

暂停或者启动一个连接。

一个连接可以同过调用这个函数或者让读或写操作的回调函数返回 CURL_READFUNC_PAUSE 或 CURL_WRITEFUNC_PAUSE 来暂停连接。

handle参数指向要暂停的会话。

bitmask参数设置了连接的新状态。如下可选:

CURLPAUSE_RECV

停止接收数据。该会话将不会在接收数据,直到再次调用没有改位状态的该函数。

CURLPAUSE_SEND

停止发送数据。该会话将不会在发送数据,直到再次调用没有改位状态的该函数。

CURLPAUSE_ALL

停止会话的发送和接收。

CURLPAUSE_CONT

重启会话的发送和接收。

、CURLcode curl_easy_recv( CURL * curl , void * buffer , size_t buflen , size_t * n);

通过一个"easy"连接接收数据。

该函数通过建立的连接接收数据。可以和curl_easy_send()函数一起使用,通过libcurl库实现自定义的协议。

buffer指向你要存储接收到的数据的地址。buflen是你可以从缓存中获取的数据的最大值,n将接收你所接收的数据的长度。

如果通过设置 CURLOPT_CONNECT_ONLY 建立起连接,curl_easy_recv()函数将无法调用。

在调用curl_easy_recv()函数之前,必须确定socket有数据可读,否则将会返回 CURLE_AGAIN 。

通过调用curl_easy_getinfo()函数,并设置参数为 CURLINFO_LASTSOCKET 来获取socket。

可通过系统工具 select() 检查是否有数据可读。

返回值:

如果成功,则返回 CURLE_OK,获得的数据将存入buffer中,而数据的大小将存入n中。

如果失败,返回占用错误代码。

如果没有数据可读,将返回 CURLE_AGAIN 。

如果没有可用的socket,将返回 CURLE_UNSUPPORTED_PROTOCOL。

、CURLcode curl_easy_send( CURL * curl , const void * buffer , size_t buflen , size_t * n);

通过一个"easy"连接发送数据。

该函数通过建立的连接发送任意数据。可以和curl_easy_recv()函数一起使用,通过libcurl库实现自定义的协议。

buffer指向你要发送的数据的地址。buflen是发送的数据的长度,n将接收你所发送的数据的长度。

如果通过设置 CURLOPT_CONNECT_ONLY 建立起连接,curl_easy_recv()函数将无法调用。

在调用curl_easy_send()函数之前,必须确定socket有数据可读,否则将会返回 CURLE_AGAIN 。

通过调用curl_easy_getinfo()函数,并设置参数为 CURLINFO_LASTSOCKET 来获取socket。

可通过系统工具 select() 检查是否有数据可读。

返回值:

如果成功,则返回 CURLE_OK,实际发送的数据的大小将存入n中。

如果失败,返回占用错误代码。

如果没有可用的socket,将返回 CURLE_UNSUPPORTED_PROTOCOL。

、void curl_easy_reset(CURL *handle);

重设一个curl句柄。

重初始化一个curl句柄,使其和刚调用curl_easy_init()函数时一样。

无法改变句柄中的以下信息:活动中的连接,Session ID cache,DNS cache,cookies 和 share。

、const char *curl_easy_strerror(CURLcode errornum);

该函数通过errornum参数,返回刚发生的错误信息的字符串。

、void curl_free( char * ptr );

释放内存。

初学libcurl的更多相关文章

  1. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  2. gulp初学

    原文地址:gulp初学 至于gulp与grunt的区别,用过的人都略知一二,总的来说就是2点: 1.gulp的gulpfile.js  配置简单而且更容易阅读和维护.之所以如此,是因为它们的工作方式不 ...

  3. 初学seaJs模块化开发,利用grunt打包,减少http请求

    原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...

  4. (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)

    1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...

  5. (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)

    1.  利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...

  6. 用libcurl 登录网站

    libcurl 可以发送和接收HTTP消息,因此可以发送用户名.密码和验证码来登录网站,网上有不少这方面的内容,但不甚完整,我摸索了两天,将其中要点记录下来. 基本步骤 正常访问登录页面,访问时,设置 ...

  7. 初学Vue2.0--基础篇

    概述: 鉴于本人初学,使用的编译器是webStorm,需添加对VUE的支持,添加方法可以参考 http://www.jianshu.com/p/142dae4f8b51. 起步: 1. 扎实的 Jav ...

  8. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  9. 初学Python

    初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...

随机推荐

  1. Go基础---->go的基础学习(五)

    这里是go中关于io的一些知识.有时不是你装得天衣无缝,而是我愿意陪你演得完美无缺. go中关于io的使用 一.Reader中的Read方法 Read 用数据填充指定的字节 slice,并且返回填充的 ...

  2. JS-匀速运动-运动停止

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. LightOJ 1348(Aladdin and the Return Journey )

    题目链接:传送门 题目大意:一棵无根树,每个点上有权值,两种操作,0 x y询问x~y路径上权值和 1 x y将 节点 x 权值变为y.对于询问操作输出答案. 题目思路:树链剖分 #include & ...

  4. kubernetes 创建tomcat 容器

    方案一: 使用k8s dashboard 创建rc 1.  界面操作 提示:暂时 忽略 查看: 2.测试 由于是外部服务 直接用  节点的ip访问: 同样也是   第二个端口可以访问.感觉 跟之前的提 ...

  5. HDCMS常用的一些调用!

    HDCMS常用的一些调用: 头部的标题/描述/关键词的调用: <title><?php if($hdcms['aid']):?><?php if($hdcms['seo_ ...

  6. nginx_log介绍和分割

    nginx access_log日志简介 log_format 日志格式 1.语法:log_format name(格式名字) 格式样式(即想要得到什么样的日志内容)示例: log_format ma ...

  7. Webservice实践(七)CXF 与Spring结合+tomcat发布

    上一节介绍了如何使用CXF 来发布服务,但是没有介绍使用web 容器来发布,很多项目需要用tomcat 这样的容器来发布.另外本节将介绍CXF 与spring 结合的方法. 一 目标: 1.利用spi ...

  8. Drawing Graphs using Dot and Graphviz

    Drawing Graphs using Dot and Graphviz Table of Contents 1. License 2. Introduction 2.1. What is DOT? ...

  9. Day20 javaWeb监听器和国际化

    day20 JavaWeb监听器 三大组件: Servlet Listener Filter   Listener:监听器 初次相见:AWT 二次相见:SAX   监听器: 它是一个接口,内容由我们来 ...

  10. sql server 碎片整理——DBCC SHOWCONTIG

    转自: 1.http://blog.sina.com.cn/s/blog_6d2675450101ks6i.html 2.http://www.cnblogs.com/CareySon/archive ...