【问题标题】:easy_curl_perform returns error 26 (write error)easy_curl_perform 返回错误 26(写入错误)
【发布时间】:2014-12-24 18:01:53
【问题描述】:

回调:

static size_t w_callback(char *ptr, size_t size, size_t nmemb, void *userdata) {
#ifdef DBG
    add_debug("Curl callback is called from pastebin");
#endif
    pastebin_ret_data = ptr;    
    return CURLE_OK;
}

主要:

curl_easy_setopt(curl, CURLOPT_POST, (void*)1);
    curl_easy_setopt(curl, CURLOPT_URL, (void*)api_url_u8.c_str());
    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, &curl_err_buf[0]);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, (void*)w_callback);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (void*)postfields_u8.c_str());
    CURLcode res = curl_easy_perform(curl);  // blocking file transfer
#ifdef DBG
    add_debug("easy_perform result: " + std::to_string(res) + 
              " error msg: " + &curl_err_buf[0] );
#endif
    curl_easy_cleanup(curl);

调试: 从 pastebin 调用 curl 回调 时间:2014年12月24日星期三09:47:44

easy_perform 结果:23 错误消息:写入正文失败 (0 != 30)

有什么问题?

【问题讨论】:

  • 注意到回调函数的返回类型了吗? size_t 应该告诉你函数应该返回一个大小而不仅仅是一个状态码。
  • 不好意思,谢谢!

标签: c++ curl


【解决方案1】:

问题是您返回 CURLE_OK 而不是返回您处理的字节数。

CURLE_OK 被定义为 0,这就是你返回的值。您在回调函数中处理的字节数必须等于函数参数接收到的数量:size_t size, size_t nmemb,这就是您必须返回的值。

文档说:你的回调应该返回实际处理的字节数。如果该数量与传递给回调函数的数量不同,它将向库发出错误条件信号。这将导致传输中止,并且使用的 libcurl 函数将返回 CURLE_WRITE_ERROR。

CURLE_WRITE_ERROR 的值为 23。


我还注意到这些 curl_easy_setopt 的最后一个参数不正确:

curl_easy_setopt(curl, CURLOPT_POST, (void*)1);
curl_easy_setopt(curl, CURLOPT_URL, (void*)api_url_u8.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, (void*)w_callback);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, (void*)postfields_u8.c_str());

给定参数类型,您传递的类型是正确的。 void* 演员表不应该在那里。

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多