在使用libcurl进行HTTP GET请求下载文件时,可以通过设置CURLOPT_WRITEFUNCTION回调来接收数据。在回调函数中,你可以通过传入的CURL*指针来获取HTTP响应头信息,从而获取content length(内容长度)。
以下是一个简单的例子,展示如何在回调函数中获取content length:
#include <curl/curl.h>
#include <stdio.h>
#include <stdlib.h>
// 写数据回调函数
size_t write_data(void *ptr, size_t size, size_t nmemb, void *userdata) {
// 这里可以处理下载的数据,userdata可以是一个文件指针或其他用于保存数据的结构体
// 例如,将数据写入文件
FILE *fp = (FILE *)userdata;
size_t written = fwrite(ptr, size, nmemb, fp);
return written;
}
// 获取content length的回调函数
int header_callback(char *buffer, size_t size, size_t nitems, void *userdata) {
// 这里的buffer是包含HTTP头信息的缓冲区
// 检查是否包含content-length头
char *content_length_header = strstr(buffer, “Content-Length:”);
if (content_length_header) {
long long content_length = 0;
// 解析content length
sscanf(content_length_header, “Content-Length: %lld”, &content_length);
// 输出content length
printf(“Content Length: %lld\n”, content_length);
// 可以将content length保存到userdata中
}
return strlen(buffer);
}
int main(void) {
CURL *curl;
FILE *fp;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();if(curl) {fp = fopen("downloaded.file", "wb");if(fp) {// 设置URLcurl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt");// 设置写数据回调函数curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);// 设置头信息回调函数curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);// 设置用户数据curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);// 执行HTTP GET请求curl_easy_perform(curl);// 关闭文件fclose(fp);}// 清理cURL资源curl_easy_cleanup(curl);
}curl_global_cleanup();
return 0;
}
在这个例子中,header_callback函数会被libcurl在接收到每一个HTTP头信息时调用。这个函数检查是否有Content-Length头,如果有,就解析出内容长度并输出。你可以在这个函数中做任何你需要做的事情来保存或处理这个内容长度信息。