c++ libcurl报错Send failed since rewinding of the data stream failed【已解决】

libcurl报错Send failed since rewinding of the data stream failed

一、问题描述

  • 使用libcurl库发送POST请求,数据格式为 multipart/form-data ,未上传文件。调用curl_easy_perform成功后未释放内存,又再次调用curl_easy_perform,报错Send failed since rewinding of the data stream failed

    传入的数据源都是字符串,不涉及到文件、缓冲区之类的,很奇怪为什么发送的数据流没有办法被rewind。一开始以为是curl_easy_perform函数的问题,后续逐步测试定位到和curl_mime有关...
    直接用的curl库,调试可设置curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);打印详细日志。

二、解决方案

    1. 如果代码涉及到了文件传输,需手动实现数据流回滚,调用rewindfseek函数,传入文件指针。
    1. 如果是自定义的读取函数 (CURLOPT_READFUNCTION),也要手动考虑数据流回滚,可通过设置CURLOPT_SEEKFUNCTION实现具体操作。
    1. 检查数据完整性,数据有可能被意外修改或不完整 (我遇到的情况)
      多了一句代码:part_ = curl_mime_addpart(mime); ,后续没有跟curl_mime_namecurl_mime_data;或者说连续调用了两次curl_mime_addpart造成数据流无法被rewind。

以下是可稳定复现问题的代码:

cpp 复制代码
#include "include/curl/curl.h"
#include "iostream"

int main(int argc, char *argv[])
{
    CURL *curl;
    CURLcode res;
    std::string data;
    curl = curl_easy_init();
    curl_mime *mime;
    mime = curl_mime_init(curl);

    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
    curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:4523/m1/6845287-6559514-default/cs");
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "Content-Type: multipart/form-data");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    // ------------------------------------
    curl_mimepart *part_;
    part_ = curl_mime_addpart(mime);      // 引起异常的代码
    // 测试代码
    part_ = curl_mime_addpart(mime);
    curl_mime_name(part_,"11");
    curl_mime_data(part_, "11", CURL_ZERO_TERMINATED);
    curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
    // ------------------------------------

    res = curl_easy_perform(curl);
    std::cout << curl_easy_strerror(res) << std::endl;

    res = curl_easy_perform(curl);
    std::cout << curl_easy_strerror(res) << std::endl;

    curl_mime_free(mime);
    curl_easy_cleanup(curl);
}

三、参考链接

相关推荐
万邦科技Lafite11 小时前
阿里巴巴拍立淘按图搜索商品API返回值实践:提升用户购物满意度的关键措施
开发语言·api·开放api·电商开放平台·京东开放平台
别动我齐刘海11 小时前
机器人运动控制学习4——状态估计 State Estimation
c++·人工智能·学习·目标检测·机器学习·机器人·自动驾驶
学习星球11 小时前
OpenHarness 全面配置教学——从游戏开发工作流引入
c++·游戏·ai·ai编程
小小龙学IT12 小时前
Qt 6 跨平台开发完全指南:从信号槽机制到实际项目落地
开发语言·qt
leisoo809712 小时前
ig50数据落盘ClickHousevsTimescaleDBvsDuckDB实测对比 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
wWYy.12 小时前
C++与C的区别
c语言·c++
敢敢のwings12 小时前
智元 GO-2 与 AgiBot-World 深度解读
开发语言·后端·golang
yaoxin52112313 小时前
503. Java 反射 - 编写 ServiceFactory 类
java·开发语言·python
一个帅气昵称啊13 小时前
.Net C# AI智能体开发-快速开始
开发语言·c#·.net
冬夜戏雪13 小时前
agent的trace 和eval
开发语言·前端·javascript