easy_curl_perform返回错误26(写入错误)

时间:2014-12-24 18:01:54

标签: c++ curl

回调:

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)

有什么问题?

1 个答案:

答案 0 :(得分: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 * casts不应该在那里。