libcurl简介:
libcurl是一个跨平台的网络协议库,支持http,ftp,https等协议。同样支持https证书授权,http post。http put,ftp上传,http基本表单上传,代理,cookie和用户认证。
在基于libcurl的程序里,主要采用callback function的形式完成传输任务,用户在启动传输前设置好各类参数和回掉函数,当满足条件时libcurl将调用用户的回掉函数实现特定功能。
下面是利用libcurl完成传输任务的流程:
1. 调用curl_global_init()初始化libcurl
2. 调用curl_easy_init()函数得到easy interface 型指针
3. 调用curl_easy_setopt()设置传输选项
4. 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务
5. 调用curl_easy_perform()函数完成传输任务
6. 调用curl_easy_cleanup()释放内存
在整个过程中设置curl_easy_setopt()参数是关键的,几乎所有的libcurl程序都要使用它。
=========================================
1). 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_NOTHIONG // 没有额外的初始化
2). curl_global_cleanup(void)
在结束libcurl使用的时候,用来对curl_global_init做的清理工作。
注意:虽然libcur是线程安全的,但是curl_global_cleanup()是不嫩保证线程安全的,所以不要在每个线程中都调用curl_global_init(),应该将该函数的调用放到主线程当中。
3). curl_easy_init();
描述:curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样)。相应的在调用结束时候要用curl_easy_cleanup()函数清理。一般curl_easy_init意味着一个会话的开始,它会返回一个easy_handle(CURL *对象),一般都用在easy系列的函数中。
4). curl_easy_cleanup(CURL *handle);
描述:这个调用用来结束一个会话,与curl_easy_init()配合着使用。
参数: CURL类型的指针。
5).CURLcode curl_easy_setopt(CURLcode *handle, CURLcode option,parameter);
描述:这个函数最重要了,几乎所有的curl程序都要频繁的使用它。它告诉curl库,程序将有如何的行为,比如要查看一个网页的html代码等。(这个函数有些像ioctl函数)。
参数:
a. CURL类型的指针;
b. 各种CURLoption 类型的选项(都在curl.h里面有定义,man也可以查看)
c. parameter 这个参数既可以是个函数的指针,也可以是某个对象的指针,也可以是个long型的变量,它用什么这取决于第二个参数。CURLoption这个参数的取值很多,具体的可以查看man手册。
6). curl_easy_perform(CURL *handle);
描述:这个函数在初始化CURL类型的指针以及curl_easy_setopt完成后调用,就像字面的意思所说的perform就像是个舞台。让我们设置的option运作起来。
参数:
CURL类型的指针。
=========================================
三. curl_easy_setopt函数部分选项介绍
本节主要介绍curl_easy_setopt中跟http相关的参数。该函数是curl中非常重要的函数。curl所有设置都是在该函数中完成的。该函数的设置选项众多,注意本节的阐述的只是部分常见选项。
1. CURLOPT_URL
设置访问URL
2. CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA
回调函数原型为: size_t function(void *ptr,size_t size, size_t nmemb, void *stream);
函数将在libcurl接收到数据后被调用,因此函数多做数据保存的功能,如处理下载文件。CURLOPT_WRITEDATA用于表明CURLOPT-WRITEFUNCTION函数中的stream指针的来源。如果没有通过CURLOPT_WRITEFUNCTION属性给easy handle设置回调函数,libcurl会提供一个默认的回调函数,它只是简单的将接收到的数据打印到标准输出。你也可以通过CURLOPT——WRITEDATA属性给默认回调哈桑农户传递一个已经打开的文件指针,用于将数据输出到文件里。