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

使用libcurl在C中下载JSON文件不完整问题求助

排查libcurl下载文件中断问题的步骤

从最易验证的点入手,逐步定位问题:

  • 第一步:检查curl执行错误码
    你的代码未处理curl_easy_perform的返回值,这是关键缺失。添加错误检查逻辑:

    CURLcode res = curl_easy_perform(curl);
    if(res != CURLE_OK) {
        fprintf(stderr, "curl执行失败: %s\n", curl_easy_strerror(res));
    }
    

    错误码能直接告诉你是网络中断、服务器异常还是curl内部错误,比如CURLE_PARTIAL_FILE就表示仅下载了部分数据。

  • 第二步:校验write_data函数的返回值
    curl要求write_data返回的字节数必须等于size * nmemb,否则会判定传输错误并终止。修改函数增加日志和校验:

    static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) {
        size_t total_bytes = size * nmemb;
        size_t written = fwrite(ptr, 1, total_bytes, (FILE *)stream);
        if(written != total_bytes) {
            fprintf(stderr, "写入异常:预期%zu字节,实际写入%zu字节\n", total_bytes, written);
            return 0; // 返回0会触发curl终止传输
        }
        fflush((FILE *)stream); // 强制刷新文件缓存,避免缓存未写入磁盘导致的"中断"假象
        return written;
    }
    
  • 第三步:分析VERBOSE日志
    你已开启CURLOPT_VERBOSE,运行程序后重点看这些日志内容:

    • 是否出现Transfer closed with X bytes remaining to read,说明服务器主动中断连接
    • 检查HTTP响应码是否为200 OK,非200码可能是服务器返回的不完整数据
    • 对比Content-Length字段和实际下载的文件大小,若前者小于后者,curl会提前终止传输
  • 第四步:验证文件与网络环境

    • 用curl命令行工具手动下载文件,对比本地生成的文件大小:
      curl -v https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld -o test.jsonld
      
      如果命令行下载的文件完整,问题出在代码;如果同样中断,说明是服务器或网络链路问题。
    • 确认ctx_file_name指向的路径有写入权限,且字符串未被截断(比如是否存在内存溢出导致路径不完整)。
  • 第五步:内存相关排查

    • 检查ctx_url_string是否为合法的C字符串(以\0结尾),避免curl解析URL出错
    • 排查代码中/* code */部分是否存在内存越界操作,比如误修改了curl相关变量的内存区域

内容的提问来源于stack exchange,提问作者shark_sh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:25:25