最近想把某网站上的些数据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. poj_2315 最小费用最大流

    题目大意 一个图上有N个顶点,从1到N标号,顶点之间存在一些无向边,边有长度,要求从顶点1走到顶点N,再从顶点N走回顶点1,其中不必要经过每个顶点,但是要求走的路径上的边只能经过一次.求出从1---& ...

  2. Java中迭代器实现的原理

    一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();wh ...

  3. Ubuntu 14.04.02 安装openvswitch-2.3.1

    Open vSwitch安装 安装好操作系统 # lsb_release -a LSB Version: core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:c ...

  4. Hibernate(1)——数据访问层的架构模式<转>

    数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设计目标 数据映射器架构模式 JDBC的缺点 Hibernate简介 迅速使用Hibernat ...

  5. 高中生的IT之路-1.3那一幕

    上一篇讲到,当时我认为自己的命运就是小时候上学,长大后外出打工,所以高中毕业后就来到了天津,到爸爸的店铺打工. 我爸的店铺就在天津大学校园里,幸运的是,我人生的转折点也就在此. 刚到店里那段时间,每天 ...

  6. MySQL命令行基本命令操作

    进入命令模式后, 显示所有数据库 show databases; 选定某个数据库 use 数据库名; 创建数据库 create database 数据库名; 删除数据库 drop table 数据库名 ...

  7. MYSQL创建数据表!

    几个常见的建表原则: a,表都加前缀b,所有的字段选择最小的数据类型,如id可以使用mediumint比INT节省25%的空间c,尽量所有的字段都设置为NOT NULL的,这样能让速度更快d,为合适的 ...

  8. Android官方架构组件指南

    此指南适用于那些曾经或现在进行Android应用的基础开发,并希望了解和学习编写Android程序的最佳实践和架构.通过学习来构建强大的生产级别的应用. 注意:此指南默认你对Android开发有比较深 ...

  9. SQLite随机获取一行数据

    Mysql中随机获取一行数据: SELECT * FROM table ORDER BY RAND() limit 1 SQLite中随机获取一行数据: SELECT * FROM table ORD ...

  10. Nmap介绍

    1.Nmap介绍 Nmap用于列举网络主机清单.管理服务升级调度.监控主机或服务运行状况.Nmap可以检测目标机是否在线.端口开放情况.侦测运行的服务类型及版本信息.侦测操作系统与设备类型等信息. 1 ...