使用libcurl步骤4之curl_easy_perform

本文深入探讨curl_easy_perform函数的使用方法,该函数用于在curl_easy_init之后执行同步文件传输,是libcurl库中关键的API之一。文章详细解释了如何通过curl_easy_perform进行阻塞式的请求执行,以及在多次调用时如何重用连接以提高效率。

文章采集自互联网,仅做学习笔记使用

curl_easy_perform - 同步执行文件传输

名称

curl_easy_perform - 执行阻止文件传输

概要

#include <curl / curl.h>

CURLcode curl_easy_perform(CURL * easy_handle);

描述

curl_easy_init之后调用此函数并进行所有curl_easy_setopt调用,并将按照选项中的描述执行传输。它必须与同被称为easy_handle作为输入作为curl_easy_init调用返回。

curl_easy_perform以阻塞方式执行整个请求,并在完成后返回,或者如果失败则返回。有关非阻塞行为,请参阅curl_multi_perform

在使用相同的easy_handle时,您可以对curl_easy_perform进行任意数量的调用。如果您打算传输多个文件,甚至鼓励您这样做。然后,libcurl将尝试为以下传输重用相同的连接,从而使操作更快,CPU密集度更低,并且使用更少的网络资源。请注意,您必须在调用之间使用curl_easy_setopt来设置以下curl_easy_perform的选项。

您绝不能使用相同的easy_handle从两个地方同时调用此函数。让函数在再次调用之前先返回。如果您想要并行传输,则必须使用多个curl easy_handles。

虽然easy_handle被添加到多个句柄中,但curl_easy_perform无法使用

返回值

CURLE_OK(0)表示一切正常,非零表示发生错误,因为<curl / curl.h>定义 - 请参阅libcurl-errors。如果使用curl_easy_setopt设置CURLOPT_ERRORBUFFER,则返回非零时,错误缓冲区中将显示可读错误消息。

 

<span style="color:#000000">CURL * curl = curl_easy_init();
if(curl){
  CURLcode res;
  curl_easy_setopt(curl,CURLOPT_URL,“http://example.com”);
  res = curl_easy_perform(curl);
  curl_easy_cleanup(卷曲);
}</span>

使用libcurl步骤1之curl_global_init

使用libcurl步骤2之curl_easy_init

使用libcurl步骤3之curl_easy_setopt

使用libcurl步骤4之curl_easy_perform

使用libcurl步骤5之curl_easy_cleanup

 

`curl_easy_setopt()` 函数的原型为:`CURLcode curl_easy_setopt(CURL * handle,CURLoption选项,参数)`。该函数用于告诉 libcurl 如何表现,通过设置适当的选项,应用程序可以更改 libcurl 的行为。 ### 参数说明 - **`handle`**:该句柄是从 `curl_easy_init` 或 `curl_easy_duphandle` 调用返回的,用于标识一个 libcurl 会话 [^2]。 - **`option`**:这是一个 `CURLoption` 类型的枚举值,用于指定要设置的选项。不同的选项需要不同类型的参数,例如 `long`、函数指针、对象指针或 `curl_off_t` 等 [^2]。 - **`参数`**:根据特定选项所期望的内容,该参数可以是不同的类型。 ### 常见的选项及参数设置示例 - **`CURLOPT_WRITEDATA`**:用于指定一个用户自定义的数据指针,该指针会在回调函数中被使用,通常用于将服务器响应的数据写入到指定的缓冲区或文件中 [^1]。 ```c #include <curl/curl.h> #include <stdio.h> // 示例回调函数 size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; FILE *fp = (FILE *)userp; fwrite(contents, size, nmemb, fp); return realsize; } int main() { CURL *curl; CURLcode res; FILE *fp; fp = fopen("output.txt", "wb"); if (fp == NULL) { return -1; } curl = curl_easy_init(); if (curl) { // 设置 URL curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); // 设置写入回调函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); // 设置 CURLOPT_WRITEDATA curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); // 执行请求 res = curl_easy_perform(curl); // 检查是否有错误 if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } // 清理 curl_easy_cleanup(curl); } fclose(fp); return 0; } ``` - **`CURLOPT_BUFFERSIZE`**:用于设置 libcurl 内部缓冲区的大小,参数类型为 `long`。 ```c #include <curl/curl.h> int main() { CURL *curl; CURLcode res; curl = curl_easy_init(); if (curl) { // 设置 URL curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); // 设置缓冲区大小为 1024 字节 curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 1024L); // 执行请求 res = curl_easy_perform(curl); // 检查是否有错误 if (res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); } // 清理 curl_easy_cleanup(curl); } return 0; } ``` ### 返回值 - `CURLE_OK`(零):表示选项设置正确。 - 非零值:表示在 `<curl/curl.h>` 定义时发生错误。如果尝试设置 libcurl 不知道的选项,可能是因为库太旧而无法支持它,或者在最近的版本中删除了该选项,则此函数将返回 `CURLE_UNKNOWN_OPTION`;如果在编译时禁用了该选项的支持,它将返回 `CURLE_NOT_BUILT_IN` [^3][^4]。 ### 注意事项 - 只能在每个函数调用中设置一个选项。典型应用程序在设置阶段使用许多 `curl_easy_setopt` 调用。 - 使用此函数调用设置的选项对使用此句柄执行的所有即将到来的传输有效。传输之间不会以任何方式重置选项,因此如果希望使用不同选项进行后续传输,则必须在传输之间进行更改。也可以选择使用 `curl_easy_reset` 将所有选项重置为内部默认值。 - 传递给 libcurl 的字符串作为 `char *` 参数,由库复制,因此 `curl_easy_setopt` 返回后,可能会覆盖与指针参数关联的字符串存储。此规则的唯一例外是 `CURLOPT_POSTFIELDS`,但复制字符串 `CURLOPT_COPYPOSTFIELDS` 的替代方案具有一些需要阅读的使用特性。 - 设置选项的顺序无关紧要。在版本 7.17.0 之前,不会复制字符串,相反,用户被强制保持可用,直到 libcurl 不再需要它们 [^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值