0

libcurl我正在尝试使用c api从某个基于 web 的 api 获取一些数据。Curl 调用 api 很好。但是,size_t nmemb太小而无法容纳响应。不知何故,它在 1280 处被“切断”了。有谁知道如何解决这个问题?也是size_t size1..

这些是我使用的功能:

int http_call(char *url) {

    CURL *curl;
    FILE *curlfile;
    CURLcode res;

    char outfilename[FILENAME_MAX] = "/usr/local/var/log/ndcurl";
    curl = curl_easy_init();
    if (curl) {

        curlfile = fopen(outfilename,"w");
        curl_easy_setopt(curl, CURLOPT_URL, url);

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_release_data);

        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

        res = curl_easy_perform(curl);

        curl_easy_cleanup(curl);
        fclose(curlfile);

    }

    return 0;

}

和回调:

static size_t write_release_data(void *buffer, size_t size, size_t nmemb, void *userp) {

    char **response_ptr =  (char**)userp;
    *response_ptr = strndup(buffer, (size_t)(size *nmemb));
    printf("The Response: %s", *response_ptr);

    return 0;

}
4

1 回答 1

1

您需要修复回调以返回实际写入的字节数。从文档

将指针传递给与以下原型匹配的函数: size_t function( char *ptr, size_t size, size_t nmemb, void *userdata);一旦收到需要保存的数据,libcurl 就会调用此函数。所指向的数据ptr大小乘sizenmemb,不会以零结尾。 返回实际处理的字节数。如果该数量与传递给您的函数的数量不同,它将向库发出错误信号。这将中止传输并返回 CURLE_WRITE_ERROR

如果你 return size * nmemb,libcurl 应该再次调用你的函数和其余的响应。

于 2012-06-15T08:04:51.737 回答