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按照官方的说法是有两种方式分别是easymulti。按照字面上的意思就是一个是较为简单的方式,而按照官网上的解释是同步的有效率的快速的(英语不是很好只能暂时这样理解了有兴趣的同学可以到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 optionparameter);

这个函数通过设置适当的选项改变CURL句柄告诉libcurl该怎样去执行操作。所有的选项都伴随着一个参数,这个参数可以是long类型,函数指针类型,一个对象实例指针,这取决于你对该选项的期望,错误的值输入可能会导致执行的结果非常糟糕。

下面介绍一下这些option

CURLOPT_VERBOSE

这个选项是用于设置是否打印出对CURL句柄的操作信息。当parameter1时显示而为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为接收将要上传数据的指针,而sizenitems的乘积即是需要读取数据的大小,而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相关操作时别调用,其中cmdtypedef enum{CURLIOCMD_NOP,CURLIOCMD_RESTARTREAD,CURLIOCMD_LAST}curliocmd;三个命令中的一个,当cmd不是这三个中的一个时需要返回CURLIOE_UNKNOWNCMD。而clientp是有选项CURLOPT_IOCTLDATA时设置的指针。

CURLOPT_URL

这个选项用于设置我们需要访问的URL,注意这边设置的URL格式需要是:scheme://host:port/pathlibcurl会根据scheme选择相应的协议。这边的parameter最好为char *类型.

CURLOPT_PROTOCOLS

这个选项设置所用的parameterlong类型的,是libcurl定义的一系列以CURLPRPTP_开头的宏,对每个支持的协议类型可以用|包括在一起或者直接使用CURLPROTO_ALL涵盖所有协议支持,这个选项不设置也是OK.

CURLOPT_REDIR_PROTOCOLS

看官方文档感觉和上一个区别不大,都是用于限制传输的协议。

CURLOPT_DEFAULT_PROTOCAL

这个选项用于设置当你设置的URLscheme为空时传入一个char*类型的协议名让libcurl可以判断并选取合适的传输协议.


0 0
原创粉丝点击