当前位置: 首页 > article >正文

【libcurl库】安装及其编程访问百度首页(一)

一、Libcurl库简介
二、Libcurl等三方库的通用编译方法

  • 库的配置、编译、安装
    • (1)安装位置的更改
    • (2)编译、安装
    • (3)预览

三、调用libcurl编程访问百度主页

  • 编译(编译时链接库、头文件路径)
  • 运行(运行需添加动态库为环境变量)
  • 永久有效,配置环境变量,要改配置文件
  • css网页样式和布局的样式表语言

四、libcurl的使用
五、libcurl常用API使用说明

  • curl_global_init()初始化 libcurl 库的全局环境
  • curl_easy_init()创建和初始化一个 CURL 对象,也称为 CURL 句柄
  • curl_easy_setopt()设置各种选项的函数
  • curl_easy_setopt函数部分选项介绍
  • curl_easy_perform()执行 HTTP 请求的函数
  • curl_easy_perform执行 HTTP 请求时可能返回不同的错误状态码
  • curl_easy_cleanup()清理释放 CURL 句柄资源的函数
  • curl_version()返回当前 libcurl 库的版本信息

在这里插入图片描述
Http协议之libcurl实现
libcurl的官网
github:libcurl库下载

一、Libcurl库简介

在linux下用c语言做HTTP的编程有一种方法是依赖于这个libcurl库,以后做跨平台网络协议相关的开发,第一个要想到的就是它。

libcurl是一个跨平台的网络协议库,支持http, https, ftp等协议,libcurl同样支持:

(1)HTTPS证书授权
(2)HTTP POST, HTTP PUT, FTP 上传
(3) HTTP基本表单上传,代理,cookies,和用户认证

libcurl(Curl Library)是一个开源、跨平台、支持多协议的客户端 URL 传输库。它允许你通过不同的网络协议(如HTTP、HTTPS、FTP、FTPS、SCP、SFTP等)在应用程序中进行数据传输。

以下是libcurl的一些主要特点和功能:

  1. 协议支持: libcurl支持多种网络协议,包括但不限于HTTP、HTTPS、FTP、FTPS、SCP、SFTP、LDAP、RTMP等。

  2. 跨平台: 可以在多个操作系统上运行,包括Unix、Linux、Windows、macOS等。

  3. SSL/TLS支持: 支持通过OpenSSL或其他SSL/TLS库进行安全传输,提供HTTPS支持。

  4. 连接池: libcurl支持连接池,可通过单个句柄(handle)进行多个并发连接。

  5. 异步操作: 提供异步API,使得应用程序能够在进行网络传输的同时执行其他任务。

  6. 多线程支持: 能够在多线程环境中使用,允许在多个线程中同时进行网络传输。

  7. 丰富的选项: 提供大量的选项和配置参数,以便开发者能够灵活地定制网络传输的行为。

  8. 高度可定制: 支持自定义数据传输、回调函数、HTTP头、代理等。

  9. 广泛应用: libcurl被许多应用程序和工具使用,如cURL命令行工具、wget、libwww等。

  10. 完全开源: 遵循MIT许可证,可以自由使用、修改和分发。

libcurl是一个功能强大、灵活且可靠的网络传输库,适用于各种网络编程场景,特别是涉及到数据传输的应用程序。

二、Libcurl等三方库的通用编译方法

在这里插入图片描述
解压下载的库

tar xvf curl-7.71.1.tar.bz2

进入文件夹

cd curl-7.71.1

对于这种开源的包,一定要学会它的使用:

先看 README,docs 文件夹里的 curl.1 和INSTALL文件

docs文件夹很重要,一般是对README的补充,相关的API手册

重点是看INSTALL文件请添加图片描述
可以看到./configure后面没有跟任何参数就是默认安装位置了,这里我们肯定要做配置,不配置都不知道文件安装到哪里去了

关于帮助:
在这里插入图片描述
不在原本默认的路径下安装说明:
在这里插入图片描述
配置是否支持https:
请添加图片描述
回到/curl-7.71.1目录下,configure --help看看

./configure --help

可以看到上文所提及的安装路径配置:
在这里插入图片描述
也可以看到特别重要的交叉编译说明:
在这里插入图片描述

库的配置、编译、安装

(1)安装位置的更改

配置为:$ 获取当前路径,编译的时候会自动生成_install文件夹,并且把编译生成的东西全部放入这个文件夹。

chmod +x configure
sudo ./configure --prefix=$PWD/_install

另外,这是针对于交叉编译的配置:编译后在树莓派上用

sudo ./configure --prefix=$PWD/_install --host=arm-linux

这样,在ubuntu中就会使用arm-gcc进行编译

如果上述操作直接在树莓派上进行,则不用再去额外配置交叉编译。工作中开发板往往没有编译工具,需要在上位机上进行编译,那么这里就要进行交叉编译配置。

(2)编译、安装

make
make install

make -j12是一个用于并行构建的make命令。它告诉make工具使用多个并行作业来加速构建过程。具体来说,-j12表示使用12个并行作业。

在使用make时,通常会看到类似的命令,其中的数字表示同时运行的作业数量。这对于大型项目的构建过程来说是很有用的,因为它可以更有效地利用多核处理器的性能,从而加快构建速度。

如果你在构建一个项目时看到了make -j12,那么这意味着make将尝试并行地执行最多12个任务,以提高构建效率。你可以根据你计算机的性能来调整这个数字,以便更好地平衡并行性和系统资源的利用。

预览

头文件
在这里插入图片描述
编译要链接的库
在这里插入图片描述

gcc a.c -lcurl

用到这个库的时候,我们同样需要链接_install/lib里面的libcurl.so动态库(.a是静态库)

三、调用libcurl编程访问百度主页

要在Linux下使用C语言编写一个使用curl库访问百度页面的例程,你首先需要确保你的系统上已经安装了libcurl库。你可以使用包管理工具来安装,例如在Ubuntu上可以使用以下命令:

sudo apt-get install libcurl4-openssl-dev

然后,你可以使用下面的C语言代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

// 回调函数,用于处理curl返回的数据
size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) {
    size_t realsize = size * nmemb;
    char *data = (char *)userp;

    // 将curl返回的数据拼接到data中
    memcpy(data, contents, realsize);

    return realsize;
}

int main(void) {
    CURL *curl;
    CURLcode res;

    // 初始化curl
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl) {
        // 设置要访问的URL
        curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");

        // 设置回调函数,用于处理返回的数据
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);

        // 设置接收返回数据的缓冲区
        char data[4096];
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, data);

        // 执行HTTP请求
        res = curl_easy_perform(curl);

        // 检查执行结果
        if(res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
        } else {
            // 输出返回的数据
            printf("%s\n", data);
        }

        // 清理curl句柄
        curl_easy_cleanup(curl);
    }

    // 全局清理
    curl_global_cleanup();

    return 0;
}

请注意,这只是一个简单的例子,实际情况中可能需要更多的错误处理和配置。此外,要编译这个程序,你需要使用以下命令:

gcc -o mycurlprogram mycurlprogram.c -lcurl

这将生成一个可执行文件mycurlprogram,你可以运行它来查看从百度页面获取的数据。

示例代码

_install里的内容结合一下示例代码来访问一下百度。
demo.c

#include <stdio.h>
#include <curl/curl.h>
 
typedef unsigned int bool;//数据类型别名用typedef  有分号
#define true 1            //宏定义(替换)用define         无冒号
#define false 0
 
bool getUrl(char *filename)//GET请求
{
        CURL *curl;
        CURLcode res;
        FILE *fp;
        if ((fp = fopen(filename, "w")) == NULL)  // 返回结果用文件存储
                return false;
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Accept: Agent-007");
        curl = curl_easy_init();    // 初始化
        if (curl)
        {
                //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");// 代理
                curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
                curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");
                curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //将返回的http头输出到fp>指向的文件,
                //即为filename文件,而主函数传入的参数是 /tmp/get.html,即为真正保存在get.html文件中
                
                curl_easy_setopt(curl, CURLOPT_HEADERDATA, fp); //将返回的html主体数据输出到fp指向的文件
                res = curl_easy_perform(curl);   // 执行
                if (res != 0) {
 
                        curl_slist_free_all(headers);  //释放句柄
                        curl_easy_cleanup(curl);
                }
                fclose(fp);
                return true;
        }
}
bool postUrl(char *filename)//POST请求
{
        CURL *curl;
        CURLcode res;
        FILE *fp;
        if ((fp = fopen(filename, "w")) == NULL)
                return false;
        curl = curl_easy_init();
        if (curl)
        {
                curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
                curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "&logintype=uid&u=xieyan&psw=xxx86");    // 指定post内容:用户信息 字段之间&连接,尝试登陆新浪邮箱
                //curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
                curl_easy_setopt(curl, CURLOPT_URL, " http://mail.sina.com.cn/cgi-bin/login.cgi ");   // 指定url
                curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
                res = curl_easy_perform(curl);//执行
                curl_easy_cleanup(curl);
        }
        fclose(fp);
        return true;
}
int main(void)
{
        getUrl("/tmp/get.html");
        postUrl("/tmp/post.html");
}

typedef unsigned int bool;//数据类型别名用typedef 有分号
#define true 1 //宏定义(替换)用define 无冒号
#define false 0
类似于bool,true,faluse,这是C99标准才会支持,C++里有专门的bool类型,用来表示真或假。
但是在C语言里没有这样的类型,为了修改方便直接这样替换

编译(编译时链接库、头文件路径)

在这里插入图片描述
在这里插入图片描述

gcc demo.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl

注意:动态库静态库的链接用 -L ,而头文件用 -I(大写)

运行(运行需添加动态库为环境变量)

生成了可执行文件./a.out直接运行可能会报错(我没有报错,可能是我用的Ubuntu22.04)。

原因是运行时要链接动态库,没有添加环境变量

cd /home/orangepi/curl-7.71.1/_install/lib
export LD_LIBRARY_PATH=./curl-7.71.1/_install/lib/

在这里插入图片描述

永久有效,配置环境变量,要改配置文件

在Linux系统上,如果你希望将libcurl库的路径添加到永久环境变量中,你可以编辑shell配置文件,例如bash的.bashrc文件。以下是在bash shell中将libcurl库路径添加到LD_LIBRARY_PATH环境变量的步骤:

  1. 打开.bashrc文件,可以使用文本编辑器如nanovimgedit等。

    nano ~/.bashrc
    
  2. 在文件的末尾添加以下行,其中/path/to/libcurl是libcurl库的实际路径。

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libcurl
    

    替换/path/to/libcurl为libcurl库的实际路径。

  3. 保存并关闭文件。

  4. 使更改生效。可以通过运行以下命令重新加载.bashrc文件:

    source ~/.bashrc
    

    或者,你可以注销并重新登录。

现在,libcurl库的路径将在每次启动新shell时自动添加到LD_LIBRARY_PATH中。这确保了libcurl库在系统范围内可用。请注意,这只对当前用户生效。如果你希望所有用户都能访问libcurl库,你可能需要将环境变量设置添加到/etc/environment文件中,这需要超级用户权限。

echo $PATH 	// 获得当前环境变量的值
pwd			// 获得当前路径

修改工作目录下的 .bashrc 隐藏文件,配置命令终端

vi /home/orangepi/.bashrc 

在文件最后一行加入:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/orangepi/curl-7.71.1/_install/lib
source /home/orangepi/.bashrc 加载配置文件,马上生效配置。

在这里插入图片描述
成功运行后,可以看到 vi /tmp/get.html 中已经有了百度官网的代码

vi /tmp/get.html
vi /tmp/post.html

在这里插入图片描述
vi /tmp/port.html 里面不会有东西,因为访问失败了:新浪的用户和密码不匹配。

css网页样式和布局的样式表语言

CSS(层叠样式表)是一种用于描述网页样式和布局的样式表语言。通过使用 CSS,你可以控制网页上各个元素的外观和排版,包括字体、颜色、间距、边框等。

以下是一些常见的 CSS 属性和其作用:

  1. 颜色属性 (color): 控制文本的颜色。

    p {
      color: blue;
    }
    
  2. 字体属性 (font-family, font-size): 指定文本的字体和大小。

    body {
      font-family: "Arial", sans-serif;
      font-size: 16px;
    }
    
  3. 背景属性 (background-color, background-image): 控制元素的背景颜色和背景图片。

    div {
      background-color: #f0f0f0;
      background-image: url('background.jpg');
    }
    
  4. 边框属性 (border): 定义元素的边框样式、宽度和颜色。

    img {
      border: 1px solid #ccc;
    }
    
  5. 尺寸和间距属性 (width, height, margin, padding): 控制元素的尺寸和间距。

    .box {
      width: 200px;
      height: 150px;
      margin: 10px;
      padding: 5px;
    }
    
  6. 定位属性 (position, top, left): 控制元素的定位方式。

    .absolute-position {
      position: absolute;
      top: 20px;
      left: 30px;
    }
    
  7. 显示和隐藏属性 (display, visibility): 控制元素的显示和隐藏。

    .hidden-element {
      display: none;
      visibility: hidden;
    }
    
  8. 动画和过渡 (animation, transition): 实现元素的动画效果。

    .fade-in {
      opacity: 0;
      transition: opacity 1s ease-in-out;
    }
    

这只是 CSS 的基础,它有很多其他属性和特性,用于更详细和复杂的页面布局和样式设计。
在这里插入图片描述

四、libcurl的使用

调用curl_global_init()初始化libcurl

调用curl_easy_init()函数得到 easy interface型指针

调用curl_easy_setopt()设置传输选项

根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务

调用curl_easy_perform()函数完成传输任务

调用curl_easy_cleanup()释放内存

五、libcurl常用API使用说明

curl_global_init()初始化 libcurl 库的全局环境

curl_global_init() 函数用于初始化 libcurl 库的全局环境。在使用 libcurl 之前,通常需要调用这个函数确保库正确设置。该函数的声明如下:

#include <curl/curl.h>

CURLcode curl_global_init(long flags);

函数接受一个 flags 参数,用于指定初始化的选项。常见的 flags 值包括:

  • CURL_GLOBAL_DEFAULT: 使用默认选项进行初始化。
  • CURL_GLOBAL_SSL: 初始化 SSL 子系统。
  • CURL_GLOBAL_WIN32: 在 Windows 下使用。
  • CURL_GLOBAL_ALL: 初始化所有支持的子系统。

下面是一个简单的例子:

#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    // 初始化 libcurl
    CURLcode res = curl_global_init(CURL_GLOBAL_DEFAULT);

    if (res != CURLE_OK) {
        fprintf(stderr, "libcurl initialization failed: %s\n", curl_easy_strerror(res));
        return 1;
    }

    // 在这里进行 libcurl 的其他操作

    // 清理 libcurl
    curl_global_cleanup();

    return 0;
}

在这个例子中,curl_global_init() 使用 CURL_GLOBAL_DEFAULT 进行初始化。在程序结束时,需要调用 curl_global_cleanup() 来清理 libcurl。

请注意,初始化和清理 libcurl 库的步骤是为了确保在使用 libcurl 之前和之后都有正确的设置。如果在使用 libcurl 时发生问题,检查是否正确进行了初始化。

curl_easy_init()创建和初始化一个 CURL 对象,也称为 CURL 句柄

curl_easy_init() 是 libcurl 库中的一个函数,用于创建和初始化一个 CURL 对象,也称为 CURL 句柄。这个句柄用于设置和执行 HTTP 请求。以下是该函数的声明:

#include <curl/curl.h>

CURL *curl_easy_init(void);

函数返回一个指向新创建的 CURL 句柄的指针。这个句柄将在后续的 libcurl 操作中被使用。

下面是一个简单的例子,演示了如何使用 curl_easy_init()

#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    // 初始化 libcurl
    CURL *curl = curl_easy_init();

    if (!curl) {
        fprintf(stderr, "Failed to initialize libcurl\n");
        return 1;
    }

    // 在这里使用 curl 处理 HTTP 请求

    // 清理 libcurl 句柄
    curl_easy_cleanup(curl);

    return 0;
}

在这个例子中,curl_easy_init() 用于创建 CURL 句柄。之后,你可以使用这个句柄设置请求选项,如设置 URL、添加请求头、指定请求方法等。完成请求后,记得使用 curl_easy_cleanup() 函数来释放分配的资源并清理 CURL 句柄。

请注意,在使用 CURL *curl = curl_easy_init(); 后,要确保在最终不再使用 CURL 句柄时调用 curl_easy_cleanup(curl); 来释放相关资源。

curl_easy_setopt()设置各种选项的函数

curl_easy_setopt() 是 libcurl 库中用于设置各种选项的函数。通过这个函数,你可以为一个 CURL 句柄设置各种参数,如请求的 URL、请求头、请求方法、超时时间等。下面是该函数的声明:

#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
  • handle: 指向已初始化的 CURL 句柄的指针。
  • option: 设置的选项,是一个枚举值,代表你要设置的具体选项。
  • parameter: 选项对应的值。

下面是一个简单的例子,演示了如何使用 curl_easy_setopt() 来设置 URL 和设置请求的超时时间:

#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    // 初始化 libcurl
    CURL *curl = curl_easy_init();

    if (!curl) {
        fprintf(stderr, "Failed to initialize libcurl\n");
        return 1;
    }

    // 设置请求的 URL
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");

    // 设置请求的超时时间(以秒为单位)
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);

    // 在这里执行 libcurl 操作,如 curl_easy_perform() 等

    // 清理 libcurl 句柄
    curl_easy_cleanup(curl);

    return 0;
}

在这个例子中,curl_easy_setopt() 被用于设置请求的 URL 和超时时间。根据具体的需求,你可以设置许多其他的选项,这些选项通过 CURLoption 枚举来表示。要了解所有可用的选项,请参考 libcurl 的文档或头文件。

记得在使用完 CURL 句柄后,调用 curl_easy_cleanup(curl); 来释放相关资源。

curl_easy_setopt函数部分选项介绍

curl_easy_setopt 函数选项

选项作用类型例子
CURLOPT_URL设置请求的 URL字符串curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");
CURLOPT_WRITEFUNCTION, CURLOPT_WRITEDATA设置用于接收响应正文的回调函数和回调函数的用户数据函数指针和用户数据指针curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
CURLOPT_HEADERFUNCTION, CURLOPT_HEADERDATA设置用于接收响应头的回调函数和回调函数的用户数据函数指针和用户数据指针curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &header_buffer);
CURLOPT_READFUNCTION, CURLOPT_READDATA设置用于提供请求正文的回调函数和回调函数的用户数据函数指针和用户数据指针curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(curl, CURLOPT_READDATA, &data_to_send);
CURLOPT_NOPROGRESS, CURLOPT_PROGRESSFUNCTION, CURLOPT_PROGRESSDATA设置是否启用进度信息、进度回调函数及回调函数的用户数据整数和函数指针curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &progress_data);
CURLOPT_TIMEOUT, CURLOPT_CONNECTTIMEOUT设置请求的超时时间和连接超时时间长整型curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5L);
CURLOPT_FOLLOWLOCATION设置是否自动跟随重定向整数curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
CURLOPT_RANGE, CURLOPT_RESUME_FROM用于指定请求的范围,支持断点续传字符串或长整型curl_easy_setopt(curl, CURLOPT_RANGE, "0-499");
curl_easy_setopt(curl, CURLOPT_RESUME_FROM, 1000L);

这是一些常用的 curl_easy_setopt 函数选项及其简要介绍:

  1. CURLOPT_URL:

    • 作用:设置请求的URL。
    • 类型:字符串。
    • 例子:curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");
  2. CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA:

    • 作用:设置用于接收响应正文的回调函数和回调函数的用户数据。
    • 类型:函数指针和用户数据指针。
    • 例子:curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
  3. CURLOPT_HEADERFUNCTION,CURLOPT_HEADERDATA:

    • 作用:设置用于接收响应头的回调函数和回调函数的用户数据。
    • 类型:函数指针和用户数据指针。
    • 例子:curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);curl_easy_setopt(curl, CURLOPT_HEADERDATA, &header_buffer);
  4. CURLOPT_READFUNCTION,CURLOPT_READDATA:

    • 作用:设置用于提供请求正文的回调函数和回调函数的用户数据。
    • 类型:函数指针和用户数据指针。
    • 例子:curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);curl_easy_setopt(curl, CURLOPT_READDATA, &data_to_send);
  5. CURLOPT_NOPROGRESS,CURLOPT_PROGRESSFUNCTION,CURLOPT_PROGRESSDATA:

    • 作用:设置是否启用进度信息、进度回调函数及回调函数的用户数据。
    • 类型:整数和函数指针。
    • 例子:curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &progress_data);
  6. CURLOPT_TIMEOUT,CURLOPT_CONNECTTIMEOUT:

    • 作用:设置请求的超时时间和连接超时时间。
    • 类型:长整型。
    • 例子:curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10L);curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5L);
  7. CURLOPT_FOLLOWLOCATION:

    • 作用:设置是否自动跟随重定向。
    • 类型:整数。
    • 例子:curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
  8. CURLOPT_RANGE, CURLOPT_RESUME_FROM:

    • 作用:用于指定请求的范围,支持断点续传。
    • 类型:字符串或长整型。
    • 例子:curl_easy_setopt(curl, CURLOPT_RANGE, "0-499");curl_easy_setopt(curl, CURLOPT_RESUME_FROM, 1000L);

以上只是其中一些常用选项的介绍,libcurl 支持的选项非常丰富。在实际使用中,你可能需要根据具体需求设置更多的选项。详细的选项说明可以参考 libcurl 的官方文档或相关头文件。

curl_easy_perform()执行 HTTP 请求的函数

curl_easy_perform() 是 libcurl 库中用于执行 HTTP 请求的函数。一旦你使用 curl_easy_init() 创建了 CURL 句柄,并通过 curl_easy_setopt() 设置了相关的选项,你可以使用 curl_easy_perform() 来执行实际的 HTTP 请求。以下是该函数的声明:

#include <curl/curl.h>

CURLcode curl_easy_perform(CURL *handle);
  • handle: 指向已初始化的 CURL 句柄的指针。

这个函数会阻塞当前线程,直到 HTTP 请求完成。成功执行返回 CURLE_OK,否则返回其他错误码,你可以使用 curl_easy_strerror() 将其转换为相应的错误信息。

下面是一个简单的例子,演示了如何使用 curl_easy_perform() 执行 HTTP 请求:

#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    // 初始化 libcurl
    CURL *curl = curl_easy_init();

    if (!curl) {
        fprintf(stderr, "Failed to initialize libcurl\n");
        return 1;
    }

    // 设置请求的 URL
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");

    // 在这里执行 libcurl 操作,如 curl_easy_perform() 等
    CURLcode res = curl_easy_perform(curl);

    // 检查执行结果
    if (res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
    }

    // 清理 libcurl 句柄
    curl_easy_cleanup(curl);

    return 0;
}

在这个例子中,curl_easy_perform() 被用于执行 HTTP 请求。在实际应用中,你可能需要更多的配置和处理,例如处理返回的数据、设置请求头、处理重定向等。这些可以通过更多的 curl_easy_setopt() 调用来完成。

curl_easy_perform执行 HTTP 请求时可能返回不同的错误状态码

curl_easy_perform 错误状态码

错误状态码说明
CURLE_OK操作成功完成,没有错误。
CURLE_UNSUPPORTED_PROTOCOL不支持的协议。例如,请求的 URL 使用了 libcurl 不支持的协议。
CURLE_COULDNT_CONNECT连接失败。libcurl 尝试与远程服务器建立连接,但连接失败。
CURLE_REMOTE_ACCESS_DENIED远程服务器拒绝访问。可能是由于没有足够的权限或远程服务器配置的问题。
CURLE_HTTP_RETURNED_ERRORHTTP 返回错误。表示服务器返回了 HTTP 错误状态码。
CURLE_READ_ERROR读取数据时发生错误。可能是因为网络问题或远程服务器关闭了连接。

curl_easy_perform 函数在执行 HTTP 请求时可能返回不同的错误状态码。以下是一些常见的 CURLcode 错误状态码,以及对它们的简要说明:

  1. CURLE_OK:

    • 说明:操作成功完成,没有错误。
  2. CURLE_UNSUPPORTED_PROTOCOL:

    • 说明:不支持的协议。例如,请求的 URL 使用了 libcurl 不支持的协议。
  3. CURLE_COULDNT_CONNECT:

    • 说明:连接失败。libcurl 尝试与远程服务器建立连接,但连接失败。
  4. CURLE_REMOTE_ACCESS_DENIED:

    • 说明:远程服务器拒绝访问。可能是由于没有足够的权限或远程服务器配置的问题。
  5. CURLE_HTTP_RETURNED_ERROR:

    • 说明:HTTP 返回错误。表示服务器返回了 HTTP 错误状态码。
  6. CURLE_READ_ERROR:

    • 说明:读取数据时发生错误。可能是因为网络问题或远程服务器关闭了连接。

这只是一些可能的错误状态码,libcurl 可能返回其他状态码以表示不同的错误情况。在实际应用中,你通常会根据 curl_easy_perform 返回的错误码来进行适当的错误处理和日志记录。

以下是一个简单的示例,演示如何检查 curl_easy_perform 返回的错误状态码:

#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    // 初始化 libcurl
    CURL *curl = curl_easy_init();

    if (!curl) {
        fprintf(stderr, "Failed to initialize libcurl\n");
        return 1;
    }

    // 设置请求的 URL
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");

    // 在这里执行 libcurl 操作,如 curl_easy_perform() 等
    CURLcode res = curl_easy_perform(curl);

    // 检查执行结果
    if (res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
    } else {
        printf("Request successful!\n");
    }

    // 清理 libcurl 句柄
    curl_easy_cleanup(curl);

    return 0;
}

在这个例子中,通过检查 curl_easy_perform 的返回值来确定是否有错误,并使用 curl_easy_strerror 函数将错误码转换为相应的错误描述。

curl_easy_cleanup()清理释放 CURL 句柄资源的函数

curl_easy_cleanup() 是 libcurl 库中用于清理释放 CURL 句柄资源的函数。一旦你使用 curl_easy_init() 创建了 CURL 句柄,并通过 curl_easy_setopt() 设置了相关的选项,以及使用 curl_easy_perform() 执行了 HTTP 请求,最后需要调用 curl_easy_cleanup() 来释放相关的资源。以下是该函数的声明:

#include <curl/curl.h>

void curl_easy_cleanup(CURL *handle);
  • handle: 指向已初始化的 CURL 句柄的指针。

这个函数负责释放 CURL 句柄所占用的资源,包括释放内存、关闭网络连接等。在使用完 CURL 句柄后,为了防止内存泄漏和资源泄漏,务必调用 curl_easy_cleanup()

下面是一个简单的例子,演示了如何使用 curl_easy_cleanup()

#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    // 初始化 libcurl
    CURL *curl = curl_easy_init();

    if (!curl) {
        fprintf(stderr, "Failed to initialize libcurl\n");
        return 1;
    }

    // 设置请求的 URL
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com");

    // 在这里执行 libcurl 操作,如 curl_easy_perform() 等
    curl_easy_perform(curl);

    // 清理 libcurl 句柄
    curl_easy_cleanup(curl);

    return 0;
}

在这个例子中,curl_easy_cleanup() 被用于清理 libcurl 句柄。在实际应用中,确保在使用完 CURL 句柄后调用这个函数是很重要的。

curl_version()返回当前 libcurl 库的版本信息

curl_version() 是 libcurl 库中的一个函数,用于返回当前 libcurl 库的版本信息。这个函数返回一个指向包含版本信息的 C 字符串的指针。以下是该函数的声明:

#include <curl/curl.h>

char *curl_version(void);

该函数不需要参数,直接调用即可。返回的字符串包含有关 libcurl 编译时使用的各种选项和功能的详细信息。这对于调试和确保程序与正确版本的 libcurl 一起运行非常有用。

以下是一个简单的示例,演示如何使用 curl_version() 函数:

#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    // 获取 libcurl 版本信息
    char *version_info = curl_version();

    // 打印版本信息
    printf("libcurl version: %s\n", version_info);

    return 0;
}

请注意,curl_version() 返回的字符串指针指向 libcurl 内部的静态缓冲区,不要尝试修改或释放这个指针。


http://www.kler.cn/a/159729.html

相关文章:

  • mysql 配置文件 my.cnf 增加 lower_case_table_names = 1 服务启动不了的原因
  • 成都睿明智科技有限公司解锁抖音电商新玩法
  • 【面试题】发起一次网络请求,当请求>=1s,立马中断
  • Qt 和 WPF(Windows Presentation Foundation)
  • linux c/c++最高效的计时方法
  • 除了 Mock.js,前端还有更方便的 Mock 数据工具吗?
  • threejs WebGLRenderer 像素比对画布大小的影响
  • 如何查看linux块大小
  • 基于Spring,SpringMVC,MyBatis的校园二手交易网站
  • 【泛型-胡乱砍】
  • php5和php7有什么区别
  • 用友U8 Cloud SQL注入漏洞复现
  • Web(7)内网渗透
  • Matlab进阶绘图第35期—双特征渲染三维散点图
  • 前端:HTML鼠标样式及其对应的CSS属性值
  • win10与 vm虚拟机win7共享文件夹创建
  • 【头歌系统数据库实验】实验5 SQL的多表查询-1
  • Day42| Leetcode 416. 分割等和子集
  • golang 字符串 底层为啥设计为字节数组存储
  • 11.27/28 知识回顾与问题(Django之Web应用与http协议)
  • 【Linux】telnet命令使用
  • scrapy介绍,并创建第一个项目
  • 辐射校正、辐射定标、大气校正关系
  • 递增子序列(回溯)
  • 【EI征稿中#先投稿,先送审#】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)
  • 腾讯云轻量对象存储LighthouseCOS详细介绍