libcurl的学习笔记和文档的翻译(有时间将会持续更新)
来源:互联网 发布:java讲师技术含量 编辑:程序博客网 时间:2024/05/13 05:10
Libcurl学习笔记、
1.Libcurl介绍:libcurl是一个开源的跨平台的网络协议库,支持http,https,ftp,gopher,telenet,dict,file和idao协议。libcurl同样支持https证书授权,http post ,put,和ftp上传,具体可以到其官网上查看资料。
2.到官网 http://curl.haxx.se/download/ 中去下载源码,并且下载安装openssl因为如果需要使用https协议的话就需要编译支持openssl。如果只想使用命令行工具curl可以直接下载可运行exe文件。
3.编译libcurl:进入解压后的目录中\projects\Windows\VC6打开vs工程(或者其他版本的也行),可以看到有许多编译的选项可以按照自己的需要选择是否添加openssl支持和编译成动态库或者静态库选项。如果选择支持openssl选项则需要自己编译或者下载相应的头文件和lib文件并且修改相应的依赖项。
4.Libcurl的使用:
Libcurl按照官方的说法是有两种方式分别是easy和multi。按照字面上的意思就是一个是较为简单的方式,而按照官网上的解释是同步的有效率的快速的(英语不是很好只能暂时这样理解了有兴趣的同学可以到https://curl.haxx.se/libcurl/c/去看看),而另一种方式我就不说了因为官方推荐的方式也是easy方式具体有兴趣的同行可以到https://curl.haxx.se/libcurl/c/libcurl-multi.html中去看看。现在我们具体看看使用easy常用到的api
(1)CURLcode curl_global_init(long flags);
描述:
这个函数只能用一次。(其实在调用curl_global_cleanup函数后仍然可再用)
如果这个函数在curl_easy_init函数调用时还没调用,它讲由libcurl库自动调用,所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。
注意:虽然libcurl是线程安全的,但curl_global_init是不能保证线程安全的,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。
参数:flags
CURL_GLOBAL_ALL //初始化所有的可能的调用。
CURL_GLOBAL_SSL //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32 //初始化win32套接字库。
CURL_GLOBAL_NOTHING //没有额外的初始化。
(2) void curl_global_cleanup(void);
描述:在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。
注意:虽然libcurl是线程安全的,但curl_global_cleanup是不能保证线程安全的,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。前面两个api的介绍是转自http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html
(3)CURL *curl_easy_init( );
这个函数必须是在使用easy模式其他函数之前被调用,这个函数会返回一个CURL句柄,这个句柄在后续的函数中都会被用到。这个函数会判断之前提到的curl_global_init();函数是否被调用没有的话会被自动调用。但是官网上的说法是不建议这样的最好是我们主动去调用。
(4)Void curl_easy_cleanup(CURL *handle);
这个函数必须在使用easy函数被调用后调用,这个函数会销毁我们之前对handle句柄的操作并且关闭连接。
(5)CURLcode curl_easy_setopt(CURL *handle,CURLoption option,parameter);
这个函数通过设置适当的选项改变CURL句柄告诉libcurl该怎样去执行操作。所有的选项都伴随着一个参数,这个参数可以是long类型,函数指针类型,一个对象实例指针,这取决于你对该选项的期望,错误的值输入可能会导致执行的结果非常糟糕。
下面介绍一下这些option
CURLOPT_VERBOSE
这个选项是用于设置是否打印出对CURL句柄的操作信息。当parameter为1时显示而为0时为不显示。
CURLOPT_HEADER
这个选项当parameter被设置为1时表示返回的数据中将包含传输协议头,设置为0时为不包含。
CURLOPT_NOPROGRESSS
当这个选项被设置为1时表示libcurl库将关闭对于这次请求的完整报告功能。
CURLOPT_NOSIGNAL
这个选项的功能没看太明白,按照我的理解应该是当parameter设置为1时把所有关于信号相关的全部屏蔽了(有时间还得研究一下)。
CURLOPT_WILDCARDMATCH
当这个选项中parameter值被设置为1时,就可以一次传输多个文件既可以使用通配符如”http://test.com/*.txt”,下载所有后缀为txt的文件。
CURLOPT_WRITEFUNCTION
这个选项用于设置当接收到数据时libcurl所调用的回调函数,回调函数的原型为:size_t write_callback(char *ptr,size_t size,size_t nmenb,void *userdata);。参数ptr是指向所接收数据的指针,而size*nmenb的值是所接收数据的大小。参数userdata是当我们使用CURLOPT_WRITEDATA这个参数时被传进来的,详细的可以去看那个选项介绍,最后当我们处理完我们的数据后我们要返回我们操作的数据量,否则libcurl会出现传输错误。
CURLOPT_WRITEDATA
CURLcode curl_setopt(CURL *handle,CURLOPT_WRITEDATA,void *pointer);参数pointer是我们传进去在接收数据回调函数中的第四个参数,如果你没有设置回调函数则要在这边设置一个FILE*指针,libcurl将会帮你把数据写入文件。否则将会把数据打印在控制台上。
CURLOPT_READFUNCTION
这个选项用于设置一个回调函数,该函数用于在使用curl进行上传数据时被libcurl自动回调,回调函数格式为size_t read_callback(char *buffer,size_t size,size_t nitems,void *instream);其中参数buffer为接收将要上传数据的指针,而size和nitems的乘积即是需要读取数据的大小,而stream是由下面一个选项READDATA设置的,用于存放将要读取的数据的指针或者文件句柄。而这个函数需要返回我们实际读取到buffer中的数据量,也可以返回CURL_READFUNC_ABORT用于马上中断正在执行的行为。
CURLOPT_READDATA
这个选项用于设置上一个选项CURLOPT_READFUNCTION中的数据指针,可以是文件指针或者数据指针(这个要取决于你在回调函数中具体的使用情况)。
CURLOPT_IOCTLFUNCTION
这个选项用于设置I/O操作的回调函数,这个回调函数的原型为:
Curlioerr ioctl_callback(CURL *handle,int cmd,void *clientp);这个函数将在有I/O相关操作时别调用,其中cmd是typedef enum{CURLIOCMD_NOP,CURLIOCMD_RESTARTREAD,CURLIOCMD_LAST}curliocmd;三个命令中的一个,当cmd不是这三个中的一个时需要返回CURLIOE_UNKNOWNCMD。而clientp是有选项CURLOPT_IOCTLDATA时设置的指针。
CURLOPT_URL
这个选项用于设置我们需要访问的URL,注意这边设置的URL格式需要是:scheme://host:port/path,libcurl会根据scheme选择相应的协议。这边的parameter最好为char *类型.
CURLOPT_PROTOCOLS
这个选项设置所用的parameter是long类型的,是libcurl定义的一系列以CURLPRPTP_开头的宏,对每个支持的协议类型可以用|包括在一起或者直接使用CURLPROTO_ALL涵盖所有协议支持,这个选项不设置也是OK的.
CURLOPT_REDIR_PROTOCOLS
看官方文档感觉和上一个区别不大,都是用于限制传输的协议。
CURLOPT_DEFAULT_PROTOCAL
这个选项用于设置当你设置的URL中scheme为空时传入一个char*类型的协议名让libcurl可以判断并选取合适的传输协议.
- libcurl的学习笔记和文档的翻译(有时间将会持续更新)
- PostgreSQL9.0文档中“持续归档和基于时间点的恢复”部分的翻译
- 对象的创建和存在时间(持续更新)
- MongoDB文档学习笔记(持续更新中)
- 新手的ubuntu学习笔记,持续更新
- 排序算法的学习笔记(持续更新)
- 有关产品经理的学习笔记(持续更新)
- 《有趣的二进制》学习笔记(持续更新)
- 将会有错误和失误的判断
- lua的更新文档(翻译中)
- 学习算法的计划(持续更新)
- latex的学习(持续更新)
- 区间DP的学习(持续更新)
- Solr学习笔记四--solrj的使用(更新文档)
- [STL]一些STL的学习笔记(持续更新)
- Scala 的学习笔记系列(持续更新中)
- java的学习 持续更新
- spark mlib官方文档学习和翻译笔记(1)
- 生活随笔
- 前台页面通过JS调用Servlet访问到后台类
- 预处理
- 有关计数问题的DP 划分数
- POJ 2728
- libcurl的学习笔记和文档的翻译(有时间将会持续更新)
- Java虚拟机执行引擎多态的实现
- 单片机==共阴数码管(4)
- Python进阶强化训练之数据结构与算法进阶
- 独家专访成人VR工作室SugarInstant VR
- Quartz.NET教程_Lesson 8: SchedulerListeners
- android的Drawable详解
- 从程序员到项目经理,没有捷径可走
- BZOJ2090/2089 [Poi2010]Monotonicity 2/Monotonicity