ibcurl是一个为网络客户端提供数据传输功能的函数库,它支持HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP或FILE等协议,支持各种SSL安全认证。使用libcurl函数库设计客户端程序的优点是,功能强大,不需要了解各种协议的细节,程序简单易行
与libcurl相关的函数被包含在头文件“curl/curl.h”中。使用libcurl前首先要对libcurl进行初始化,可通过curl_global_init()函数实现,它的一般形式是:
CURLcode curl_global_init(long flags);
该函数只能使用一次,如果在调用curl_easy_init()函数前没有调用curl_global_init()函数,那么curl_easy_init()函数会自动调用curl_global_init()函数参数flags用于指定初始化状态,它的可选范围是一组枚举变量,如表所示。
CURL_GLOBAL_ALL | 初始化所有可能的调用 |
CURL_GLOBAL_SSL | 初始化支持安全套接字层的调用 |
CURL_GLOBAL_WIN32 | 初始化WIN32套接字库 |
CURL_GLOBAL_NOTHING | 没有额外的初始化要求 |
在结束libcurl使用的时候,可使用curl_global_init()函数清理内存,该函数的作用类似于close()系统调用。
对libcurl初始化后,可使用curl_easy_init()函数获得一个CURL操作符,这个操作符的作用与文件操作符非常相似,程序中可通过CURL操作符访问相应的网络资源。该函数的一般形式是:
CURL *curl_easy_init();
在CURL操作符使用完毕,同样需要对其内存进行清理,可使用函数curl_easy_cleanup()完成,它的一般形式是:
void curl_easy_cleanup(CURL *handle);
进行数据传输前必须告诉libcurl如何工作,使用curl_easy_setopt()函数可指定libcurl的工作方式,或者在程序运行中改变libcurl工作方式。它的一般形式是:
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
该函数的第一个参数是CURL标识符,第二个参数是CURLoption类型的选项,第三个参数parameter既可以是函数的指针,又可以是某个对象的指针,也可以是long型的变量,它的类型取决于第二个参数的定义,CURLoption类型中关于HTTP和FTP的选项如后表所示
设置好工作方式后,可使用curl_easy_perform()函数执行相关操作。该函数的一般形式是:
CURLcode curl_easy_perform(CURL *handle);
函数执行后,就会根据curl_easy_setopt()函数指定的工作方式开始工作。如果执行成功,返回值为0,否则返回一个错误代码。常见的错误代码如表所示
![](https://i-blog.csdnimg.cn/blog_migrate/cac823f3316b4494384515f68b1e8ae3.png)
实例:使用libcurl实现简单的HTTP访问
:
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
FILE *fp;
size_t write_data(void *ptr,size_t size,size_t nmemb,void *stream)
{
int written=fwrite(ptr,size,nmemb,(FILE *) fp);
return written;
}
int main (int argc, char *argv[])
{
CURL *curl;
curl_global_init(CURL_GLOBAL_ALL);
curl=curl_easy_init();
curl_easy_setopt(curl,CURLOPT_URL,argv[1]);
if((fp=fopen(argv[2],"w"))==NULL)
{
puts("请以正确的形式输入要保存的文件名");
curl_easy_cleanup(curl);
return 1;
}
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
return 0;
}