2012-06-15 84 views
0

我想從某個基於web的API使用libcurl c 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; 

} 

回答

1

您需要修正回調返回寫入的字節的實際數量。從the documentation

傳遞一個指向函數的指針相匹配的原型如下: size_t function(char *ptr, size_t size, size_t nmemb, void *userdata);此功能得到由libcurl中只要有數據稱爲接收到需要保存。 的ptr的數據大小爲size乘以nmemb,它不會被零終止。 返回實際照顧的字節數。如果 的金額與傳遞給您的函數的金額不同,它會向庫發出錯誤 的信號。這將中止轉移並返回 CURLE_WRITE_ERROR

如果你返回size * nmemb,libcurl應該再次調用你的函數和其餘的響應。

+0

它也可以指出,回調將被稱爲多次,直到所有數據已交付 –

+0

好吧,它現在有效。還有一個問題:我需要將完整的響應傳遞給另一個函數。我會怎麼做? –

+0

您需要將響應緩存在某處(使用'malloc'創建的全局文件,磁盤上的文件等)並等待curl將其發送給您。您必須閱讀捲曲文檔以瞭解它如何表示傳輸已完成。如果您要傳輸多個網址,請在回調函數中使用'userdata'參數來跟蹤狀態。 – tomlogic