0

libcurlc APIを使用して、特定の Web ベースの API からデータを取得しようとしています。Curl は API を正常に呼び出します。ただし、size_t nmemb小さすぎて応答を保持できません。どういうわけか、1280で「カットオフ」されています。これを解決する方法を知っている人はいますか? またsize_t size、1..

これらは私が使用する機能です:

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は でsize乗算されnmembます。ゼロ終端されません。 実際に処理されたバイト数を返します。その量が関数に渡された量と異なる場合、ライブラリにエラーが通知されます。これにより、転送が中止され、 が返され CURLE_WRITE_ERRORます。

が返された場合size * nmemb、libcurl は残りの応答で関数を再度呼び出す必要があります。

于 2012-06-15T08:04:51.737 に答える