libcurl函数库中主要函数的应用

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的选项如后表所示

libcurl函数库中主要函数的应用_第1张图片

设置好工作方式后,可使用curl_easy_perform()函数执行相关操作。该函数的一般形式是:


CURLcode curl_easy_perform(CURL *handle);

函数执行后,就会根据curl_easy_setopt()函数指定的工作方式开始工作。如果执行成功,返回值为0,否则返回一个错误代码。常见的错误代码如表所示


libcurl函数库中主要函数的应用_第2张图片

 实例:使用libcurl实现简单的HTTP访问

#include 
#include 
#include 

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;
}

你可能感兴趣的:(linux_c)