libcurl编程流程
时间:2010-06-01 来源:majia1984
首先,调用函数curl_global_init()来初始化库函数;
调用curl_easy_init()来初始化一个句柄,得到一个easy interface型指针;
接着,再调用curl_easy_setopt来设置将要访问的网络地址,当然还有许多其它的选项可以设置,这是libcurl编程的重点。
返回的数据怎样传给客户端应用程序呢?
先自己写一个回调函数,然后把这个回调函数通过curl_easy_setopt设置到libcurl库里。再指定是什么的数据格式接收,当libcurl库返回数据时就会回调设置的函数。
定义回调函数:
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);
设置回调函数
curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, write_data);
设置回调函数接收的数据格式
curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &internal_struct);
通过调用curl_easy_perform来连接远程的网站,开始协议相关的操作,libcurl库启动下载或上传数据。
libcurl curl_easy_setopt()说明
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
CURLOPT_VERBOSE
设置这个选项的参数为1,libcurl会显示出一些操作的详细信息。这对于libcurl和协议的调试和理解很有帮助。
CURLOPT_HTTPHEADER
构造HTTP头部字段,或代替现有字段(从而移除已有字段)。该选项传递一个指针,这个指针指向HTTP请求中传给server的头部字段链表(linked list)。用curl_slist_append(3)来创建头部字段list,curl_slist_free(3)用来清除list 。例如:增加User-Authertication这个头部字段。
使用libcurl设置HTTP头部字段的方法:
#include <curl/curl.h>
Struct curl_slist *slist = NULL;
Slist = curl_slist_append(slist, “Connection: Keep-Alive”); //http长连接
Curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
Curl_easy_perform(handle);
Curl_slist_free_all(slist);
CURLOPT_PUT/CURLOPT_UPLOAD
设置这个选项为1,让libcurl使用HTTP PUT来传输数据。从7.12.1版本开始,使用CURLOPT_UPLOAD来代替CURLOPT_PUT。使用这个选项还要通过CURLOPT_READDATA 和 CURLOPT_INFILESIZE来设置要传输的数据。
CURLOPT_READDATA
设置传递给读函数的数据指针。如果使用了 CURLOPT_WRITEFUNCTION 参数, 可以使用这个指针作为输入,如果没有使用CURLOPT_WRITEFUNCTION, 则必需给出一个FILE*类型指针, libcurl会将其传递给fwrite()。
在7.9.7版本之前,这个选项叫CURLOPT_INFILE。
CURLOPT_INFILESIZE
当向远程站点上传文件时,这个选项用来设置上传文件的大小。
CURLOPT_POST
这个选项设置为1,告知libcurl执行HTTP POST操作。
默认libcurl会使用"Content-Type: application/x-www-form-urlencoded"头部字段,你也可以用CURLOPT_HTTPHEADER选项来更改这个字段。使用HTTP1.1的POST方法意味着使用"Expect: 100-continue"字段,你也可以用CURLOPT_HTTPHEADER来取消这个字段。
可以设置CURLOPT_READFUNCTION 和CURLOPT_READDATA选项来为POST提供数据,同时,不能再设置CURLOPT_POSTFIELDS选项。当使用callback函数来提供数据时,一定要使用大块数据传输编码(chunked transfer-encoding)或者用CURLOPT_POSTFIELDSIZE 或CURLOPT_POSTFIELDSIZE_LARGE选项设置数据大小。chunked transfer-encoding可以用CURLOPT_HTTPHEADER来设置字段。
如果使用了POST请求方法,想要用同一个handle来GET或HEAD,必须用CURLOPT_NOBODY 或CURLOPT_HTTPGET选项来设置新的请求方法。
CURLOPT_WRITEFUNCTION
设置指向回调函数的指针,回调函数原型如下:
size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
当libcurl接收到要保存的数据时调用此函数, 因此该函数多作数据保存的功能,如处理下载文件。ptr所指数据大小为 size*nmemb. 返回实际处理的数据大小,如果返回值不等于传递给函数的数据大小,则报错,并返回CURLE_WIRTE_ERROR。
如果此选项的参数设置为NULL, 则会调用默认的函数,将数据写入到FILE*(由CURLOPT_WRITEDATA 给出)
此回调函数会尽量处理更多数据,但是传递给回调函数的数据最大值定义在curl.h文件中。
CURLOPT_WRITEDATA
在7.9.7版本以前,这个选项叫CURLOPT_FILE。该选项设置一个数据指针传递给函数。如果使用了 CURLOPT_WRITEFUNCTION 参数, 可以使用这个指针作为输入,指明CURLOPT_WRITEFUNCTION函数的stream指针的来源。如果没有使用CURLOPT_WRITEFUNCTION, 则必需给出一个FILE*类型, libcurl会将其传递给fwrite()。如:
FILE *fp;
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
int written;
written = fwrite(ptr, size, nmemb, (FILE *)fp);
return written;
}
CALLBACK OPTIONS
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
CURLOPT_HEADERFUNCTION,CURLOPT_HEADERDATA
回调函数原型为 size_t function( void *ptr, size_t size,size_t nmemb, void *stream); libcurl一旦接收到http 头部数据后将调用该函数。CURLOPT_WRITEDATA 传递指针给libcurl,该指针表明CURLOPT_HEADERFUNCTION 函数的stream指针的来源。
CURLOPT_READFUNCTION CURLOPT_READDATA
libCurl需要读取数据传递给远程主机时将调用CURLOPT_READFUNCTION指定的函数,函数原型是:size_t function(void *ptr, size_t size, size_t nmemb,void *stream). CURLOPT_READDATA 表明CURLOPT_READFUNCTION函数原型中的stream指针来源。
HTTP OPTIONS
CURLOPT_POSTFIELDS
作用:描述传输的数据,必须确保传输的数据服务器可以解析,libcurl不会转化或encode,但是大部分服务器假定这些数据是url-encoded,
此选项使用后POST是一个application/x-www-form-urlencoded类型。
CURLOPT_COOKIEJAR
作用:在关闭链接的时候把cookie写入指定的文件
curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "/tmp/cookie.txt");
CURLOPT_COOKIEFILE
作用:取用现有的cookie,而不重新得到cookie
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt");
CURLOPT_TIMEOUT,CURLOPT_CONNECTIONTIMEOUT:
CURLOPT_TIMEOUT 由于设置传输时间,CURLOPT_CONNECTIONTIMEOUT 设置连接等待时间
参考网站:
[1]各种HTTP/FTP客户端开发库http://blog.csdn.net/heiyeshuwu/archive/2007/07/15/1691904.aspx
[2]Libcurl编程http://www.miidoo.cn/info_detail-227.html
[3]Libcurl编程手册及代码实例
http://www.maycode.com/index.php/linux/54-linuxdevelop/1151-curl.html
[4]Simplify Network Programming with libCURL
http://www.linuxdevcenter.com/pub/a/linux/2005/05/05/libcurl.html
[5]libcurl note(Http应用)及API介绍http://blog.chinaunix.net/u2/61797/article_82446.html
[6]libcurl使用的简单例子http://blog.chinaunix.net/u/27904/showart_462499.html