【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的一些主要特点和功能:
-
协议支持: libcurl支持多种网络协议,包括但不限于HTTP、HTTPS、FTP、FTPS、SCP、SFTP、LDAP、RTMP等。
-
跨平台: 可以在多个操作系统上运行,包括Unix、Linux、Windows、macOS等。
-
SSL/TLS支持: 支持通过OpenSSL或其他SSL/TLS库进行安全传输,提供HTTPS支持。
-
连接池: libcurl支持连接池,可通过单个句柄(handle)进行多个并发连接。
-
异步操作: 提供异步API,使得应用程序能够在进行网络传输的同时执行其他任务。
-
多线程支持: 能够在多线程环境中使用,允许在多个线程中同时进行网络传输。
-
丰富的选项: 提供大量的选项和配置参数,以便开发者能够灵活地定制网络传输的行为。
-
高度可定制: 支持自定义数据传输、回调函数、HTTP头、代理等。
-
广泛应用: libcurl被许多应用程序和工具使用,如cURL命令行工具、wget、libwww等。
-
完全开源: 遵循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
环境变量的步骤:
-
打开
.bashrc
文件,可以使用文本编辑器如nano
、vim
、gedit
等。nano ~/.bashrc
-
在文件的末尾添加以下行,其中
/path/to/libcurl
是libcurl库的实际路径。export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libcurl
替换
/path/to/libcurl
为libcurl库的实际路径。 -
保存并关闭文件。
-
使更改生效。可以通过运行以下命令重新加载
.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 属性和其作用:
-
颜色属性 (
color
): 控制文本的颜色。p { color: blue; }
-
字体属性 (
font-family
,font-size
): 指定文本的字体和大小。body { font-family: "Arial", sans-serif; font-size: 16px; }
-
背景属性 (
background-color
,background-image
): 控制元素的背景颜色和背景图片。div { background-color: #f0f0f0; background-image: url('background.jpg'); }
-
边框属性 (
border
): 定义元素的边框样式、宽度和颜色。img { border: 1px solid #ccc; }
-
尺寸和间距属性 (
width
,height
,margin
,padding
): 控制元素的尺寸和间距。.box { width: 200px; height: 150px; margin: 10px; padding: 5px; }
-
定位属性 (
position
,top
,left
): 控制元素的定位方式。.absolute-position { position: absolute; top: 20px; left: 30px; }
-
显示和隐藏属性 (
display
,visibility
): 控制元素的显示和隐藏。.hidden-element { display: none; visibility: hidden; }
-
动画和过渡 (
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
函数选项及其简要介绍:
-
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);
以上只是其中一些常用选项的介绍,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_ERROR | HTTP 返回错误。表示服务器返回了 HTTP 错误状态码。 |
CURLE_READ_ERROR | 读取数据时发生错误。可能是因为网络问题或远程服务器关闭了连接。 |
curl_easy_perform
函数在执行 HTTP 请求时可能返回不同的错误状态码。以下是一些常见的 CURLcode
错误状态码,以及对它们的简要说明:
-
CURLE_OK:
- 说明:操作成功完成,没有错误。
-
CURLE_UNSUPPORTED_PROTOCOL:
- 说明:不支持的协议。例如,请求的 URL 使用了 libcurl 不支持的协议。
-
CURLE_COULDNT_CONNECT:
- 说明:连接失败。libcurl 尝试与远程服务器建立连接,但连接失败。
-
CURLE_REMOTE_ACCESS_DENIED:
- 说明:远程服务器拒绝访问。可能是由于没有足够的权限或远程服务器配置的问题。
-
CURLE_HTTP_RETURNED_ERROR:
- 说明:HTTP 返回错误。表示服务器返回了 HTTP 错误状态码。
-
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 内部的静态缓冲区,不要尝试修改或释放这个指针。