簡體   English   中英

如何在不使用文件指針的情況下在libcurl中發送長PUT數據?

[英]How do I send long PUT data in libcurl without using file pointers?

我正在嘗試與Google Contact API進行交互,為了更新遠程端的聯系人,我需要使用PUT請求而不是POST。

由於我想要PUT的數據已經在內存中,我真的不想處理文件指針,這似乎是CURLOPT_READDATA的默認行為。 因此,我知道除此之外我還需要使用CURLOPT_READFUNCTION,但我無法理解邏輯。

以下是相關文檔: http//curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTREADFUNCTION

打印傳入的變量,我看到nmemb=16372size=1 例如,如果我的數據大小為100K,那么我需要實現的邏輯是什么?

謝謝。

您仍然希望使用CURLOPT_READDATA ,但是如果使用CURLOPT_READFUNCTION ,它可以是任何用戶指定的指針。 您可以創建一個簡單的結構,如:

struct put_data
{
  char *data;
  size_t len;
};

其中data是PUT數據, len是長度(剩余)。

然后,將CURLOPT_READDATA為指向該結構的初始化實例的指針。 您將在CURLOPT_READFUNCTION中將其作為userdata傳遞給它。 在該功能中,執行以下操作:

size_t curl_size = nmemb * size;
size_t to_copy = (userdata->len < curl_size) ? userdata->len : curl_size;
memcpy(ptr, userdata->data, to_copy);
userdata->len -= to_copy;
userdata->data += to_copy;
return to_copy;

這基本上計算出復制,復制,然后更新長度和指針的數量。 to_copy行,我們計算最小值,因為它們受剩余量和curl緩沖區大小的限制。 最后,我們返回curl要求復制的字節數。 當你在內容結束時user_data->len (因此to_copy )將為0.什么都不會被復制,返回0結束傳輸。

這是正確的方法。

要記住的另一件事是你必須設置文件大小:

curl_easy_setopt(curlHandle, CURLOPT_INFILESIZE,(curl_off_t)putData.size);

否則,您的服務器可能會拋出錯誤,指出未指定請求長度。

putData是put_data結構的一個實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM