You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 07:54:50