如何让libcurl仅返回指定长度的网站HTML内容?
问题原因
CURL_MAX_WRITE_SIZE是编译libcurl时生效的宏,你在自己的代码里重新定义根本没用——libcurl库已经编译完成,这个参数早就固定了。CURLOPT_BUFFERSIZE仅用于设置curl内部的缓冲区大小,不是限制总下载字节数,所以修改它不会让curl停止下载完整内容。
正确实现方式
要限制总下载量,得在写回调函数里累计接收的字节数,达到上限后返回非预期值,让curl终止传输。另外注意:curl的写回调函数必须符合标准签名,你当前的processCode函数参数格式错误,会导致未定义行为。
修正后的代码:
#include <stdio.h> #include <curl/curl.h> // 用于跟踪下载进度的结构体 typedef struct { size_t total_received; size_t max_limit; } DownloadLimit; // 标准curl写回调函数签名 size_t processCode(char *ptr, size_t size, size_t nmemb, void *userdata) { DownloadLimit *limit = (DownloadLimit *)userdata; size_t current_bytes = size * nmemb; // 计算剩余可接收的字节数,避免超过上限 if (limit->total_received + current_bytes > limit->max_limit) { current_bytes = limit->max_limit - limit->total_received; } // 输出内容(可替换为自定义处理逻辑) fwrite(ptr, 1, current_bytes, stdout); limit->total_received += current_bytes; // 返回实际处理的字节数,若小于传入的总字节数,curl会终止传输 return current_bytes; } int main(){ CURL *curl = curl_easy_init(); if (!curl) { fprintf(stderr, "curl初始化失败\n"); return 1; } DownloadLimit limit = {0, 650000}; // 设置最大接收650000字节 curl_easy_setopt(curl, CURLOPT_URL, "https://amazon.com"); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, processCode); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &limit); // 将限制结构体传给回调函数 CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK && res != CURLE_ABORTED_BY_CALLBACK) { fprintf(stderr, "curl请求失败: %s\n", curl_easy_strerror(res)); } curl_easy_cleanup(curl); return 0; }
关键说明
- 用自定义结构体
DownloadLimit跟踪已接收字节数和上限,通过CURLOPT_WRITEDATA传递给回调函数。 - 回调函数中计算剩余可接收字节,只处理对应长度的数据,更新累计值后返回实际处理量。
- 当返回的处理量小于传入的总字节数时,curl会终止传输,返回
CURLE_ABORTED_BY_CALLBACK错误码,这是预期的终止信号。
内容的提问来源于stack exchange,提问作者jDoe
相关产品推荐
相关产品推荐

