详解libcurl Easy interface API(C++)

详解libcurl Easy interface API(C++)

libcurl是一个功能强大且广泛使用的开源网络传输库,提供了Easy interface API,用于简化网络请求的创建和管理。Easy interface API允许开发者使用简单的函数调用来实现各种网络传输操作,包括发送HTTP请求、下载文件、处理FTP连接等。

通过libcurl的Easy interface API,开发者可以轻松地进行网络通信,无论是与远程服务器进行数据交换,还是从网络上下载文件。以下是Easy interface API的主要功能和用法:

  1. 初始化和清理:使用curl_easy_init()函数初始化一个CURL句柄,通过curl_easy_cleanup()函数进行清理。
  2. 设置URL和选项:使用curl_easy_setopt()函数来设置网络请求的URL、请求方法(GET、POST等)以及其他选项,如请求头、超时时间、SSL配置等。
  3. 执行请求:通过调用curl_easy_perform()函数来执行网络请求。该函数会阻塞当前线程,直到请求完成或发生错误。
  4. 处理响应:可以通过设置回调函数来处理服务器返回的数据。使用curl_easy_setopt()函数设置CURLOPT_WRITEFUNCTION选项,并指定一个回调函数来接收响应数据。
  5. 错误处理:libcurl会返回一个CURLcode错误代码,开发者可以使用curl_easy_strerror()函数将其转换为可读的错误信息。

除了以上主要功能,Easy interface API还提供了其他一些有用的函数和选项,如设置代理、处理重定向、使用Cookie等。

总之,libcurl的Easy interface API提供了简单而强大的方法来进行网络通信,使开发者能够更轻松地实现各种网络传输操作。无论是初学者还是有经验的开发人员,都可以通过这个API轻松地在应用程序中集成网络功能。

1、curl_global_init

函数 curl_global_init() 是libcurl库中的一个函数,该函数用于全局初始化curl库。

函数原型如下:

CURLcode curl_global_init(long flags);

参数:

参数 flags 是一个标志位,用于设置全局初始化的选项。常用的选项包括:

  • CURL_GLOBAL_ALL: 初始化所有的支持的功能,包括线程安全、DNS解析、SSL等。
  • CURL_GLOBAL_SSL: 只初始化SSL相关的功能。
  • CURL_GLOBAL_WIN32: 只适用于Windows平台,初始化适用于Win32的功能。
  • CURL_GLOBAL_NOTHING: 表示libcurl在全局初始化时不初始化任何功能。此选项会禁用libcurl的所有功能,包括线程安全、DNS解析和SSL等。使用此选项进行全局初始化后,你将无法使用libcurl库提供的任何网络传输功能。

返回值:

函数返回值为 CURLcode 类型的错误代码。返回值为 CURLE_OK 表示初始化成功,其他返回值表示初始化过程中出现了错误。

全局初始化只需在程序启动时调用一次,不需要在每个curl_easy_init()函数调用之前都进行初始化。如果多次调用curl_global_init()函数,libcurl会自动处理多次调用的情况。

以下是一个示例代码:

#include <stdio.h>
#include <curl/curl.h>
int main() {
  CURLcode result = curl_global_init(CURL_GLOBAL_ALL);
  if (result != CURLE_OK) {
    fprintf(stderr, "curl_global_init() failed: %s\n", curl_easy_strerror(result));
    return 1;
  // perform other libcurl operations
  curl_global_cleanup();
  return 0;
}

上述示例代码中,使用 CURL_GLOBAL_ALL 标志进行全局初始化,然后执行其他的libcurl操作。最后,在程序退出前调用 curl_global_cleanup() 函数进行清理操作。

2、curl_global_cleanup

函数 curl_global_cleanup() 是libcurl库中的一个函数,用于进行全局清理。

函数原型如下:

void curl_global_cleanup(void);

该函数用于清理和释放libcurl库的全局资源。在程序退出之前,应调用该函数来确保释放libcurl占用的系统资源。

请注意, curl_global_cleanup() 函数应在最后一个 curl_easy_cleanup() 函数调用之后进行调用。如果在调用 curl_easy_cleanup() 之后还有其他libcurl操作,那么不应该调用 curl_global_cleanup() 函数,因为全局清理将关闭所有的libcurl句柄和资源。

需要注意的是,全局清理是可选的。如果没有进行全局初始化 curl_global_init() ,则无需调用 curl_global_cleanup() 。但如果进行了全局初始化,则应在程序退出时调用全局清理函数,以确保正确释放资源。

3、curl_easy_init()

函数 curl_easy_init() 是libcurl库中的一个函数,用于创建并返回一个CURL句柄,用于执行curl请求。调用 curl_easy_init() 函数会分配并返回一个CURL句柄,该句柄可以用于执行各种curl请求操作,如发送HTTP请求、获取响应、设置请求选项等。

函数原型如下:

CURL *curl_easy_init(void);

参数:

返回:

  • 该函数返回一个指向CURL会话句柄的指针,如果初始化成功,将返回非NULL的指针;否则返回NULL指针。

4、curl_easy_cleanup()

函数 curl_easy_cleanup() 是libcurl库中的一个函数,用于清理和释放由 curl_easy_init() 函数创建的一个CURL句柄。

函数原型如下:

void curl_easy_cleanup(CURL *handle);

参数 handle 是一个指向CURL句柄的指针,表示需要清理和释放的句柄。

调用 curl_easy_cleanup() 函数后,该句柄及其相关资源将被释放,并且不再可用于执行curl请求。

以下是一个示例代码:

需要注意的是, curl_easy_cleanup() 函数应在不再需要使用CURL句柄之后进行调用。在调用该函数之后,句柄将不再有效,不能再使用句柄执行任何curl操作。

另外,如果在程序中有多个CURL句柄,每个句柄都需要调用 curl_easy_cleanup() 进行清理和释放。不应该将同一个句柄传递给多个 curl_easy_cleanup() 函数调用。

5、curl_easy_setopt

curl_easy_setopt() 是libcurl库中的一个C API函数,用于设置CURL会话的各种选项。通过该函数,可以设置URL、请求头、请求方法、超时时间等等。

函数原型如下:

CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
  • handle:CURL会话句柄,即通过curl_easy_init()函数初始化得到的指针。
  • option:要设置的选项,是一个预定义的枚举值,表示需要设置的具体选项。
  • parameter:选项的参数值,根据具体的选项而不同。

CURLoption 是一个枚举类型,用于表示 curl_easy_setopt 函数中的选项类型。它定义了各种不同的选项,以指定要设置的具体行为或配置。

以下是对一些常见的 CURLoption 选项的参数进行介绍:

分类:URL相关参数

  1. CURLOPT_URL :参数为字符串类型,用于设置要处理的URL地址。
  2. CURLOPT_HTTPGET :默认为0。设置为1表示发起一次GET请求。
  3. CURLOPT_POST :指定是否使用HTTP POST方法。默认为0,设置为1表示发起一次POST请求。
  4. CURLOPT_POSTFIELDS :参数为字符串类型,用于提交HTTP的POST请求的数据。
  5. CURLOPT_COOKIE :参数为字符串类型,设置HTTP头中的Cookie信息。
  6. CURLOPT_COOKIEFILE :参数为字符串类型,与 CURLOPT_COOKIE 类似,不过Cookie信息从文件中读取。
  7. CURLOPT_TIMEOUT :参数为long数值类型,用于设置函数执行的最长时间,单位为秒。
  8. CURLOPT_CONNECTTIMEOUT :参数为long数值类型,用于设置连接服务器的最长时间,单位为秒。设置为0表示无限长。
  9. CURLOPT_MAX_RECV_SPEED_LARGE :参数为curl_off_t类型,指定下载过程中的最大速度,单位为字节/秒。
  10. CURLOPT_NOPROGRESS :布尔值类型,默认为1。关闭CURL传输显示的进度条。

分类:调试和信号处理参数

  1. CURLOPT_VERBOSE :默认为0。打开或关闭详细模式,参数设置为1可使库显示有关操作的详细信息。
  2. CURLOPT_NOSIGNAL :默认为0。控制是否使用信号处理函数。
  3. CURLOPT_TCP_NODELAY :默认为1。控制是否关闭TCP的Nagle算法。
  4. CURLOPT_TCP_KEEPALIVE :默认为0。控制是否开启TCP的keep-alive功能。
  5. CURLOPT_TCP_KEEPIDLE :默认为60秒。设置TCP的keep-alive空闲时间等待。
  6. CURLOPT_TCP_KEEPINTVL :默认为60秒。设置TCP的keep-alive间隔时间。

分类:SSL参数

  1. CURLOPT_SSL_CIPHER_LIST :传递一个指向零终止的字符串,包含用于SSL连接的密码列表。
  2. CURLOPT_SSL_VERIFYPEER :默认为1。控制是否验证对端的SSL证书。
  3. CURLOPT_SSL_VERIFYHOST :默认为2。控制是否验证证书的名字和URL中的服务器是否匹配。

分类:请求头信息参数

  1. CURLOPT_HEADER :默认为0。指定写回调函数 WRITEFUNCTION 是否包含报文的头部信息。
  2. CURLOPT_HTTPHEADER CURLOPT_HTTPHEADER 是一个 curl_slist 结构体类型的参数,它允许用户自定义HTTP请求的头信息。HTTP头部用于在请求中传递额外的信息,如身份验证凭据、自定义标头字段等。
  3. 使用CURLOPT_HTTPHEADER参数,可以设置多个自定义的HTTP头信息,每个头信息都需要使用curl_slist结构体表示。可以使用curl_slist_append函数向curl_slist结构体中添加头信息,并将该结构体设置为CURLOPT_HTTPHEADER选项的值。

例如,以下代码段演示了如何设置自定义的HTTP头信息:

// 创建一个curl_slist结构体  
struct curl_slist *header = NULL;
 // 添加自定义的头信息  
header = curl_slist_append(header, "Content-Type: application/json");  
header = curl_slist_append(header, "Authorization: Bearer your_token");
 // 设置CURLOPT_HTTPHEADER选项  
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);  


在上面的示例中,我们通过curl_slist_append将两个自定义的头信息添加到curl_slist结构体中,然后使用curl_easy_setopt函数将该curl_slist结构体设置为CURLOPT_HTTPHEADER选项的值。

这样,每次使用cURL进行HTTP请求时,请求头信息中就会包含我们自定义的头信息,以便传递额外的信息给服务器。请注意,在设置CURLOPT_HTTPHEADER时,要确保在请求之前设置好,并在请求完成后释放curl_slist结构体的内存。

总结:CURLOPT_HTTPHEADER参数允许用户自定义HTTP请求的头信息,通过设置curl_slist结构体来添加和管理自定义的头信息。这使得在发送请求时可以传递额外的信息给服务器。

分类:回调

1、 CURLOPT_WRITEFUNCTION :用于设置一个回调函数,用于接收从服务器接收到的响应数据。

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEFUNCTION, write_callback);

在使用 curl_easy_setopt 函数时,你可以使用 CURLOPT_WRITEFUNCTION 选项来指定一个函数,用于处理响应数据。这个函数的原型应该符合以下形式:

size_t write_callback(void *ptr, size_t size, size_t nmemb, void *userdata);

    • ptr :指向接收到的数据的指针。
    • size :每个数据块的大小(以字节计算)。
    • nmemb :数据块的数量。
    • userdata :用户定义的指针,用于传递额外的数据或上下文(可选)。

回调函数应该返回实际处理的数据的大小(以字节为单位)。如果返回的大小与 size * nmemb 不同,libcurl会将处理的数据大小视为错误,并终止传输。
通过使用 CURLOPT_WRITEFUNCTION 选项,你可以自定义处理接收到的响应数据的方式。例如,你可以将接收到的数据保存到文件中、将其传递给其他处理函数,或者进行其他逻辑处理。
一旦设置了 CURLOPT_WRITEFUNCTION 选项,并且已经设置了接收数据的目的地(例如使用 CURLOPT_WRITEDATA 选项设置了指向文件的指针),libcurl将在接收到数据时调用该回调函数,并传递相应的参数。
请注意,在回调函数中处理数据时,确保处理的方式与数据的类型和格式相匹配,以避免错误和数据损坏。

  • CURLOPT_WRITEDATA :设置 CURLOPT_WRITEFUNCTION 回调函数的用户数据指针。
  • 当使用 curl_easy_setopt 函数设置 CURLOPT_WRITEFUNCTION 选项时,你可以使用 CURLOPT_WRITEDATA 选项来设置一个指针,该指针将在调用 CURLOPT_WRITEFUNCTION 回调函数时传递给该函数的 userdata 参数。
    CURLOPT_WRITEDATA 选项的值应该是一个指针,指向你想要传递给 CURLOPT_WRITEFUNCTION 回调函数的用户数据。
    这个用户数据指针是可选的,你可以根据需要选择使用它。它可以用于传递额外的上下文信息、指向数据结构的指针或其他用途。
    CURLOPT_WRITEFUNCTION 回调函数中,你可以通过 userdata 参数访问和操作这个用户数据指针的值。
    请注意,要确保在使用 CURLOPT_WRITEDATA 设置指针之前,这个指针已经被初始化或指向有效的内存地址。并且,当不再需要使用该指针时,要小心释放或清理相关资源,以避免内存泄漏和其他问题。
  • CURLOPT_READFUNCTION
  • 数据上传的读取回调,用于设置一个回调函数,该函数被用于提供要发送给服务器的请求数据。
    在使用 curl_easy_setopt 函数时,可以使用 CURLOPT_READFUNCTION 选项指定一个回调函数,该函数负责提供要发送到服务器的请求数据。回调函数的原型应满足以下形式:
    c size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata);
    回调函数的参数含义如下:
    • ptr :指向缓冲区的指针,用于在回调函数中存储要发送的数据。
    • size :每个数据块的大小(以字节为单位)。
    • nmemb :数据块的数量。
    • userdata :用户定义的指针,用于传递额外的数据或上下文(可选)。

回调函数应该将要发送的数据复制到 ptr 指向的缓冲区,并返回实际复制的数据大小(以字节为单位)。如果返回的大小与 size * nmemb 不同,libcurl将视为错误并终止传输。
通过使用 CURLOPT_READFUNCTION 选项,你可以自定义提供请求数据的方式。例如,你可以从文件中读取数据、从内存中提供数据,或者通过其他逻辑生成数据。
一旦设置了 CURLOPT_READFUNCTION 选项,并且设置了读取数据的来源(例如使用 CURLOPT_READDATA 选项设置指向数据的指针),libcurl将在需要发送请求数据时调用该回调函数,并传递相应的参数。
请注意,在回调函数中处理数据时,确保提供的数据与服务器期望的数据类型和格式相匹配,以避免错误和数据损坏。同时,确保在没有数据可提供时正确处理返回值,例如返回0表示无数据可供发送。
另外,注意在使用 CURLOPT_READFUNCTION 选项时,通常也需要设置 CURLOPT_UPLOAD 选项为1,以指示进行上传操作。

  • CURLOPT_READDATA 用于设置 CURLOPT_READFUNCTION 回调函数的用户数据指针。
  • 当使用 curl_easy_setopt 函数设置 CURLOPT_READFUNCTION 选项时,你可以使用 CURLOPT_READDATA 选项来设置一个指针,该指针将在调用 CURLOPT_READFUNCTION 回调函数时传递给该函数的 userdata 参数。
  • CURLOPT_READDATA 选项的值应该是一个指针,指向你想要传递给 CURLOPT_READFUNCTION 回调函数的用户数据。
  • 这个用户数据指针是可选的,你可以根据需要选择使用它。它可以用于传递额外的上下文信息、指向数据结构的指针或其他用途。
  • CURLOPT_READFUNCTION 回调函数中,你可以通过 userdata 参数访问和操作这个用户数据指针的值。
  • 请注意,在使用 CURLOPT_READDATA 设置指针之前,要确保指针已经被初始化或指向有效的内存地址。当不再需要使用该指针时,要小心释放或清理相关资源,以避免内存泄漏和其他问题。同时,在回调函数中,确保使用的数据来源和指针的生命周期与 CURLOPT_READDATA 设置的一致,以避免潜在的问题。
  • CURLOPT_HEADERFUNCTION (报文头回调函数指针)
  • CURLOPT_HEADERFUNCTION是一个函数指针参数,用于设置接收报文头信息的回调函数。当使用cURL进行HTTP请求时,服务器的响应中包含了报文头(header),该参数允许用户定义一个回调函数来处理这些报文头信息。
    在设置CURLOPT_HEADERFUNCTION时,需要提供一个函数指针,指向一个自定义的回调函数。该回调函数需要满足以下原型:
    cpp size_t header_callback(char *buffer, size_t size, size_t nitems, void *userdata);
    回调函数的参数说明如下:
    • buffer :指向接收到的报文头数据的缓冲区。
    • size :每个数据块的大小(字节数)。
    • nitems :数据块的数量。
    • userdata :用户自定义数据指针,可以在回调函数中使用。

回调函数需要返回一个size_t类型的值,表示实际处理的字节数。一般情况下,回调函数会处理接收到的报文头信息,可以打印、分析或保存这些信息。
以下是设置CURLOPT_HEADERFUNCTION参数的示例代码:

// 自定义的报文头回调函数 
size_t header_callback(char buffer, size_t size, size_t nitems, void userdata) {     size_t total_size = size * nitems;     
// 处理报文头信息,比如打印或保存     
printf("Received header data: %s\n", buffer);     return total_size; }
 // 设置CURLOPT_HEADERFUNCTION选项 
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); 

在上面的示例中,我们定义了一个名为header_callback的回调函数,它打印接收到的报文头信息,并返回实际处理的字节数。然后,通过curl_easy_setopt函数将该回调函数设置为CURLOPT_HEADERFUNCTION选项的值。
这样,当cURL执行HTTP请求并接收到响应时,每次接收到报文头数据时,都会调用我们自定义的回调函数进行处理。

综上,CURLOPT_HEADERFUNCTION参数允许用户自定义一个回调函数来处理接收到的报文头信息。该回调函数会在接收到报文头数据时被调用,可以在函数内部对报文头进行处理,比如打印、分析或保存报文头信息。

  • CURLOPT_HEADERDATA (报文头回调函数的用户数据指针)
  • CURLOPT_HEADERDATA 是一个指针参数,用于设置传递给报文头回调函数的用户自定义数据。当使用cURL进行HTTP请求并设置了CURLOPT_HEADERFUNCTION参数指定了报文头回调函数时,可以通过设置CURLOPT_HEADERDATA参数来传递额外的用户数据给回调函数。
    在设置CURLOPT_HEADERDATA参数时,可以传递任意类型的指针。该指针会作为参数之一传递给报文头回调函数,以供回调函数在处理报文头时使用。
    以下是设置CURLOPT_HEADERDATA参数的示例代码:
// 自定义的报文头回调函数 
size_t header_callback(char buffer, size_t size, size_t nitems, void userdata) {     
  // 从CURLOPT_HEADERDATA获取用户自定义数据     
  MyData data = (MyData )userdata;
  // 处理报文头信息,可以使用传递的用户数据 
  printf("Received header data: %s\n", buffer);  
  return size * nitems;
// 用户自定义数据结构 
typedef struct {     
  int value1;     
  double value2;     
  // 其他自定义字段 } MyData;
// 创建并设置用户自定义数据对象
MyData myData; myData.value1 = 10; 
myData.value2 = 3.14;
// 设置CURLOPT_HEADERFUNCTION选项 
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); 
// 设置CURLOPT_HEADERDATA选项,传递用户自定义数据指针 
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &myData); 

  • 在上面的示例中,我们定义了一个名为header_callback的报文头回调函数,它通过CURLOPT_HEADERDATA参数接收用户自定义数据。在回调函数中,我们使用传递的用户数据来处理报文头信息。
    首先,我们创建了一个自定义的数据结构MyData,并设置了一些字段的值。然后,通过curl_easy_setopt函数将header_callback函数设置为CURLOPT_HEADERFUNCTION选项的值,并将myData的指针传递给CURLOPT_HEADERDATA选项。
    这样,在报文头回调函数被调用时,我们可以通过CURLOPT_HEADERDATA获取传递的用户自定义数据。回调函数在处理报文头时可以使用这些数据完成更复杂的操作。

综上:CURLOPT_HEADERDATA参数允许将用户自定义的数据指针传递给报文头回调函数。通过设置CURLOPT_HEADERDATA可以在回调函数中使用和访问这些用户数据,以完成更复杂的报文头处理操作。

6、curl_easy_perform

函数 curl_easy_perform() 是libcurl库中的一个函数,用于执行通过 curl_easy_setopt() 函数设置的CURL请求。

函数原型如下:

CURLcode curl_easy_perform(CURL *handle);

参数

  • handle 是一个CURL句柄,表示要执行的CURL请求。

返回值

函数返回一个CURLcode枚举类型的结果,用于指示请求执行的状态。如果返回 CURLE_OK ,表示请求执行成功;如果返回非零错误码,则表示发生了错误。

以下是一些主要的错误码说明:

  • CURLE_OK : 请求成功完成。
  • CURLE_UNSUPPORTED_PROTOCOL : 不支持的协议,由URL的头部指定。
  • CURLE_COULDNT_CONNECT : 无法连接到远程主机或代理。
  • CURLE_REMOTE_ACCESS_DENIED : 访问被拒绝。
  • CURLE_HTTP_RETURNED_ERROR : HTTP返回错误。
  • CURLE_READ_ERROR : 读取本地文件错误。

下面是一个示例代码:

#include <stdio.h>
#include <curl/curl.h>
int main() {
  CURL *handle = curl_easy_init();
  if (handle == NULL) {
    fprintf(stderr, "Failed to initialize CURL handle\n");
    return 1;
  // Set URL and other options using curl_easy_setopt()
  CURLcode res = curl_easy_perform(handle);
  if (res != CURLE_OK) {
    fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
    return 1;
  curl_easy_cleanup(handle);
  return 0;
}

在上述示例代码中,首先创建一个CURL句柄,并设置URL和其他选项。然后,调用 curl_easy_perform() 函数执行请求,并检查返回的结果码。如果返回的结果码不是 CURLE_OK ,则打印错误信息。

需要注意的是,在调用 curl_easy_perform() 之前,必须通过 curl_easy_setopt() 函数设置所需的选项,如URL、请求头、请求方法、请求体等。 curl_easy_setopt() 函数可以设置多个选项,以满足具体的请求需求。

7、curl_easy_getinfo

curl_easy_getinfo 是libcurl库中用于获取与传输相关的信息的函数。它接受一个CURL句柄、一个CURLINFO参数和其他可选参数,用于获取与传输操作相关的信息。

函数原型如下:

CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);

参数说明: - curl :CURL句柄,用于获取信息的传输。

  • info :CURLINFO参数,指定要获取的信息类型。 CURLINFO 用于指定要获取的具体信息类型。下面是一些常用的 CURLINFO 常量及其描述:
  • CURLINFO_EFFECTIVE_URL : 获取请求的最终URL。该信息对应的参数类型是 char*
  • CURLINFO_RESPONSE_CODE : 获取服务器的HTTP响应代码。该信息对应的参数类型是 long
  • CURLINFO_TOTAL_TIME : 获取传输的总时间,包括DNS解析、连接、传输等时间。该信息对应的参数类型是 double
  • CURLINFO_CONTENT_TYPE : 获取服务器返回的内容类型。该信息对应的参数类型是 char*
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD : 获取下载内容的总大小。该信息对应的参数类型是 double
  • CURLINFO_SPEED_DOWNLOAD : 获取下载速度。该信息对应的参数类型是 double
  • CURLINFO_NAMELOOKUP_TIME : 获取DNS解析时间。该信息对应的参数类型是 double
  • CURLINFO_CONNECT_TIME : 获取连接建立时间。该信息对应的参数类型是 double
  • CURLINFO_PRETRANSFER_TIME : 获取在传输开始之前的时间(即,发起请求到服务器响应之间的时间)。该信息对应的参数类型是 double
  • CURLINFO_REDIRECT_TIME : 获取重定向所花费的总时间。该信息对应的参数类型是 double
  • CURLINFO_REDIRECT_COUNT : 获取重定向的次数。该信息对应的参数类型是 long
  • CURLINFO_HEADER_SIZE : 获取接收到的报文头的大小。该信息对应的参数类型是 long
  • CURLINFO_REQUEST_SIZE : 获取发送的请求的大小。该信息对应的参数类型是 long
  • CURLINFO_SSL_VERIFYRESULT : 获取SSL认证结果。该信息对应的参数类型是 long
  • CURLINFO_SPEED_UPLOAD : 获取上传速度。该信息对应的参数类型是 double
  • CURLINFO_CONTENT_LENGTH_UPLOAD : 获取上传内容的总大小。该信息对应的参数类型是 double
  • 更多内容见: curl.se/libcurl/c/curl_
  • 可以根据具体的需求选择适当的 CURLINFO 常量,并将合适的参数类型传递给 curl_easy_getinfo 函数,以获取相应的信息。

以下是一个示例,演示如何使用 CURLINFO_EFFECTIVE_URL CURLINFO_RESPONSE_CODE 获取请求的URL和服务器的响应代码:

// 创建CURL句柄   
CURL *curl = curl_easy_init();   
if(curl) {       
  // 设置URL和其他选项       
  curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
  // 执行URL传输
  CURLcode res = curl_easy_perform(curl);
  // 检查传输结果
  if(res != CURLE_OK) {
      fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  } else {
      // 获取传输信息
      char* effective_url;
      long response_code;
      res = curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
      if(res == CURLE_OK) {
          printf("Effective URL: %s\n", effective_url);
      } else {
          fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
      res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
      if(res == CURLE_OK) {
          printf("Response Code: %ld\n", response_code);
      } else {
          fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
  // 清理CURL句柄
  curl_easy_cleanup(curl);

在上面的示例中,我们设置了URL并执行了URL传输。然后,使用 curl_easy_getinfo 函数分别获取了请求的最终URL和服务器的HTTP响应代码,并将结果存储在 effective_url response_code 变量中。

请注意,当使用 curl_easy_getinfo 时,需要检查返回的错误代码,以确保获取信息的成功与否。

综上: CURLINFO 常量用于指定要获取的具体信息类型,可以通过 curl_easy_getinfo 函数获取与传输操作相关的各种信息。根据 CURLINFO 常量的不同,对应的信息类型和参数传递方式也不同。根据具体需求选择合适的常量,并将对应的参数类型传递给 curl_easy_getinfo 函数,以获取相应的信息。

  • ... :其他可选参数,用于存储获取到的信息。

返回值:

  • CURLcode:表示函数执行结果的枚举类型。如果返回值为CURLE_OK,则表示获取信息成功。其他返回值代表不同的错误或状态。

函数功能:

  • curl_easy_getinfo函数可以获取与传输操作相关的各种信息,如传输状态、传输速度、文件大小等。
  • 函数根据传入的CURLINFO参数指定要获取的具体信息类型,并将获取到的信息存储到提供的参数中。 - 获取到的信息的数据类型取决于CURLINFO参数的值和提供的参数的类型。

示例代码:

// 创建CURL句柄
CURL *curl = curl_easy_init();
if(curl) {
    // 设置URL和其他选项
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
    // 执行URL传输
    CURLcode res = curl_easy_perform(curl);
    // 检查传输结果
    if(res != CURLE_OK) {
        fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
    } else {
        // 获取传输信息
        double total_time;
        res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);
        if(res == CURLE_OK) {
            printf("Transfer time: %.2f seconds\n", total_time);
        } else {
            fprintf(stderr, "curl_easy_getinfo() failed: %s\n", curl_easy_strerror(res));
    // 清理CURL句柄
    curl_easy_cleanup(curl);

在上面的示例中,我们首先创建了一个CURL句柄,并设置了URL和其他传输选项。然后使用curl_easy_perform函数执行URL传输。如果传输成功,我们使用curl_easy_getinfo函数获取传输的总时间信息,并将结果存储在total_time变量中。

通过检查curl_easy_getinfo函数的返回值,我们可以确定获取信息的成功与否,并根据情况输出获取到的信息或错误信息。最后通过curl_easy_cleanup清理CURL句柄。

总结:curl_easy_getinfo函数用于获取与传输操作相关的信息。函数根据传入的CURLINFO参数指定要获取的具体信息类型,并将获取到的信息存储到提供的参数中。函数的返回值表示获取信息的结果,CURLE_OK表示获取成功。

8、curl_version()

函数 curl_version() 是libcurl库中的一个函数,用于获取当前libcurl版本的字符串表示。

函数原型如下:

char *curl_version(void);

该函数不需要输入参数,它返回一个指向以空结尾的字符串的指针,表示当前libcurl的版本信息。

以下是一个示例代码:

#include <stdio.h>
#include <curl/curl.h>
int main() {
  char *version = curl_version();
  printf("libcurl version: %s\n", version);
  return 0;
}

在上述示例代码中,调用 curl_version() 函数获取当前libcurl版本的字符串表示,并将其打印到控制台。

需要注意的是,返回的版本字符串是静态分配的,不需要手动释放内存。不应该尝试修改或释放该字符串,而应直接使用或打印它。

9、curl_getdate

curl_getdate 用于将日期字符串转换为 time_t 类型的时间值。

time_t curl_getdate(char *datestring, time_t *now);

该函数接受一个日期字符串作为输入,并尝试将其转换为对应的 time_t 时间值。函数还可以接受一个可选的 now 参数,用于提供当前时间的参考值。如果提供了 now 参数,则在转换日期字符串时会使用 now 参数作为参考时间。如果 now 参数为NULL,则使用当前系统时间作为参考。

示例用法:

#include <curl/curl.h>
#include <stdio.h>
int main() {
    char datestring[] = "Sat, 01 Jan 2022 12:00:00 GMT";
    time_t now = time(NULL);
    time_t converted_time = curl_getdate(datestring, &now);
    if (converted_time != -1) {
        printf("Converted time: %s", ctime(&converted_time));
    } else {
        printf("Failed to convert the date string\n");
    return 0;

在上面的示例中,我们定义了一个日期字符串,并提供一个当前时间作为参考。然后,使用 curl_getdate 函数将日期字符串转换为 time_t 类型的时间值,并将转换后的时间值打印出来。

请注意,如果日期字符串无法被正确解析为一个有效的时间值, curl_getdate 函数将返回-1。

综上: curl_getdate 是libcurl库中的函数,用于将日期字符串转换为 time_t 类型的时间值。它接受一个日期字符串作为输入,并尝试将其转换为对应的 time_t 时间值。可以选择提供一个当前时间的参考值,以便在转换日期字符串时使用。转换成功时,函数返回转换后的时间值;如果转换失败,函数返回-1。

10、curl_mime_init

curl_mime 是libcurl用于处理MIME数据的结构。MIME(Multipurpose Internet Mail Extensions)是一种用于标识在网络上发送的多媒体和其他非ASCII数据的标准。

curl_mime *curl_mime_init(CURL *easy_handle);

参数:

  • easy :一个已经初始化的 CURL 句柄,用于进行MIME数据处理。

返回值:

  • curl_mime 结构的指针:如果初始化成功,函数将返回一个指向初始化的 curl_mime 结构的指针。可以使用该指针进行MIME数据的处理。如果初始化失败,函数将返回 NULL

注意事项:

  • 在调用 curl_mime_init 函数之前,应首先使用 curl_easy_init 函数初始化一个 CURL 句柄,然后将该句柄作为参数传递给 curl_mime_init 函数。
  • 在使用完 curl_mime 结构后,应使用 curl_mime_free 函数释放该结构,以避免内存泄漏。
  • 当不再需要使用 CURL 句柄时,应使用 curl_easy_cleanup 函数将其清理

示例用法:

#include <curl/curl.h>
#include <stdio.h>
int main() {
    CURL *curl = curl_easy_init();
    if (!curl) {
        fprintf(stderr, "Failed to initialize libcurl\n");
        return 1;
    curl_mime *mime = curl_mime_init(curl);
    if (!mime) {
        fprintf(stderr, "Failed to initialize CURL MIME structure\n");
        curl_easy_cleanup(curl);
        return 1;
    // 使用mime结构进行MIME数据的处理
    curl_mime_free(mime);
    curl_easy_cleanup(curl);
    return 0;

在上面的示例中,我们首先使用 curl_easy_init 函数初始化了CURL句柄,然后使用 curl_mime_init 函数初始化了 curl_mime 结构。如果初始化成功,则可以使用 mime 结构进行MIME数据的处理。在处理完MIME数据后,我们使用 curl_mime_free 函数释放了 mime 结构。最后,使用 curl_easy_cleanup 函数清理CURL句柄。

总结: curl_mime_init 是libcurl库中用于初始化 curl_mime 结构的函数。它接受一个CURL句柄作为参数,并返回一个指向初始化的 curl_mime 结构的指针。可以使用返回的结构指针进行MIME数据的处理。记得在使用完毕后,使用 curl_mime_free 函数释放 curl_mime 结构,并使用 curl_easy_cleanup 函数清理CURL句柄。

11、curl_formadd

该函数已被弃用。 请改用 curl_mime_init

12、curl_slist_append

curl_slist_append 用于向 curl_slist 结构中添加新的字符串元素。

函数原型如下:

struct curl_slist *curl_slist_append(struct curl_slist *list,
                                     const char *string);

参数: - list :一个指向 curl_slist 结构的指针,表示一个字符串列表。初始时,该指针可以为 NULL ,随着调用 curl_slist_append 添加字符串元素,会返回一个指向更新后字符串列表的指针。 - string :要添加到字符串列表的字符串。

返回:

返回值是一个指向更新后字符串列表的指针。如果添加成功,返回的指针将指向新的字符串列表。如果添加失败,返回的指针将与 list 参数相同。

curl_slist 结构是一个链表,它用于存储字符串元素。使用 curl_slist_append 函数可以将新的字符串元素添加到链表的末尾,并返回更新后链表的指针。

curl_slist 是libcurl库中用于存储字符串列表的数据结构。它被定义为一个结构体:

struct curl_slist {
    char *data;           // 字符串数据
    struct curl_slist *next;  // 指向下一个元素的指针
};

curl_slist 结构体由两个字段组成: - data :指向字符串数据的指针,存储列表中的每个字符串。 - next :指向下一个列表元素的指针,用于构成链表。

使用 curl_slist 结构体可以创建一个简单的字符串链表,每个链表节点存储一个字符串。常见用途是在libcurl中设置HTTP请求头或POST数据。函数 curl_slist_append 可以方便地向 curl_slist 结构中添加新的字符串节点。

以下是一个示例,演示如何使用 curl_slist 结构和相关函数 curl_slist_append curl_slist_free_all 创建和释放字符串链表:

#include <stdio.h>
#include <curl/curl.h>
int main() {
    struct curl_slist *list = NULL;
    // 添加字符串元素到链表
    list = curl_slist_append(list, "Accept: application/json");
    list = curl_slist_append(list, "Content-Type: application/json");
    // 遍历链表并打印每个字符串
    struct curl_slist *item = list;
    while (item != NULL) {
        printf("%s\n", item->data);
        item = item->next;
    // 释放链表内存
    curl_slist_free_all(list); // 释放整个链表
    return 0;
}

在上面的示例中,我们使用 curl_slist_append 函数将两个字符串元素添加到链表中,然后遍历链表并打印每个字符串。最后,我们使用 curl_slist_free_all 函数释放链表内存。

通过使用 curl_slist 结构,我们可以方便地构建和管理字符串列表,以满足libcurl库中对于字符串链表的需求。

请注意,使用完 curl_slist 结构后,应该使用 curl_slist_free_all 函数释放链表内存,以避免内存泄漏。

13、curl_slist_free_all

curl_slist_free_all 用于释放使用 curl_slist 结构创建的字符串链表的内存。

函数原型如下:

void curl_slist_free_all(struct curl_slist *list);

参数: - list :一个指向 curl_slist 结构的指针,表示要释放的字符串链表。

该函数用于释放整个字符串链表及其节点所占用的内存。它会遍历整个链表,并释放每个元素的 data 字段指向的字符串内存,然后释放每个链表节点的内存。

14、curl_easy_escape

curl_easy_escape 用于对给定的字符串进行URL编码。

函数原型如下:

char *curl_easy_escape(CURL *curl, const char *string, int length);

参数解释: - curl :一个指向 CURL 类型的指针,用于指定与URL编码相关的配置选项。通常情况下,可以传递 NULL ,它将使用默认配置。 - string :要进行URL编码的字符串。 - length :字符串的长度(不包括结尾的空字符)。如果设置为 -1 ,则函数将自动计算字符串长度。

返回值是一个指向URL编码字符串的指针,这个字符串是通过对输入字符串进行编码而得到的。如果发生错误或内存分配失败,返回值将为 NULL

示例用法:

#include <stdio.h>
#include <curl/curl.h>
int main() {
    CURL *curl = curl_easy_init();
    const char *string = "Hello, World!";
    char *encoded_string = curl_easy_escape(curl, string, -1);
    if (encoded_string) {
        printf("Encoded string: %s\n", encoded_string);
        curl_free(encoded_string);  // 释放URL编码字符串的内存
    curl_easy_cleanup(curl);
    return 0;
}

在上面的示例中,我们首先使用 curl_easy_init 函数初始化 CURL 类型的指针,然后定义一个字符串 string 。接下来,我们调用 curl_easy_escape 函数对字符串进行URL编码,并将结果存储在 encoded_string 中。然后,我们使用 printf 打印编码后的字符串,并最后通过调用 curl_free 释放 encoded_string 的内存。最后,我们使用 curl_easy_cleanup 函数清理CURL句柄。

注意:当使用完 encoded_string 后,需要通过 curl_free 函数手动释放 encoded_string 的内存,以避免内存泄漏。

15、curl_easy_unescape

curl_easy_unescape 是libcurl库中的一个函数,用于对经过URL编码的字符串进行解码。

函数原型如下:

char *curl_easy_unescape(CURL *curl, const char *input,
                         int inlength, int *outlength);

参数解释: - curl :一个指向 CURL 类型的指针,用于指定与URL解码相关的配置选项。通常情况下,可以传递 NULL ,它将使用默认配置。 - input :需要进行URL解码的字符串。 - inlength input 字符串的长度(不包括结尾的空字符)。如果设置为 -1 ,则函数将自动计算字符串长度。 - outlength :一个指向整数的指针,用于存储解码后字符串的长度。解码后字符串的长度将通过这个指针返回给调用者。

返回值是一个指向解码后字符串的指针。解码后的字符串会通过动态分配内存来存储,并且必须在不需要的时候进行释放。如果发生错误或内存分配失败,返回值将为 NULL

示例用法:

#include <stdio.h>
#include <curl/curl.h>
int main() {
    CURL *curl = curl_easy_init();
    const char *input = "Hello%2C%20World%21";
    int outlength;
    char *decoded_string = curl_easy_unescape(curl, input, -1, &outlength);
    if (decoded_string) {
        printf("Decoded string: %s\n", decoded_string);
        printf("Decoded string length: %d\n", outlength);
        curl_free(decoded_string);  // 释放解码后字符串的内存