簡體   English   中英

libcurl:curl_easy_perform塊,除非設置了CURLOPT_READFUNCTION

[英]libcurl: curl_easy_perform blocks unless CURLOPT_READFUNCTION is set

我正在嘗試使用libcurl C ++進行REST / HTTP請求。 我注意到curl_easy_perform塊,但是如果我設置CURLOPT_READFUNCTION則不會。 我只是想了解為什么,我是libcurl或HTTP / REST協議的新手。

這是代碼:

m_pCurl = curl_easy_init();
curl_easy_setopt(m_pCurl, CURLOPT_URL, "https://blahblahblah/api/auth/user/login");      
curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(m_pCurl, CURLOPT_POST, 1);
curl_easy_setopt(m_pCurl, CURLOPT_COOKIE, "SKEY=BLAHBLAHBLAH");

struct curl_slist *list = NULL;

list = curl_slist_append(list, "Accept: application/json");
list = curl_slist_append(list, "Connection: keep-alive");
list = curl_slist_append(list, "Expect:");
list = curl_slist_append(list, "Content-Type: application/json");
list = curl_slist_append(list, "x-website-parameters: LALALALA");
curl_easy_setopt(m_pCurl, CURLOPT_HTTPHEADER, list);

// Callbacks
readarg_t rarg;

// readcb is a callback function
// Removing the two lines below will cause curl_easy_perform to hang
curl_easy_setopt(m_pCurl, CURLOPT_READFUNCTION, readcb);
curl_easy_setopt(m_pCurl, CURLOPT_READDATA, &rarg);

CURLcode res = curl_easy_perform(m_pCurl);

注意:某些編碼數據已在上面更改。

任何幫助將不勝感激。

謝謝,K

根據手冊 ...

CURLOPT_READFUNCTION解釋

...

如果將此回調指針設置為NULL,或者根本不設置,則將使用默認的內部讀取功能。 它正在使用CURLOPT_READDATA設置的FILE *用戶數據上執行fread()。

但是,您也沒有設置CURLOPT_READDATA 因此,再次查看《手冊》 ...

CURLOPT_READDATA說明

...

默認情況下,這是stdin的FILE *。

因此,您的程序“掛起”的原因似乎是因為它正在等待標准輸入 stdin上的內容到達。

因此,它的工作方式應該是這樣。

1)如果您什么也不做,則發送到服務器的數據來自標准輸入 (通常是鍵盤)。

2)如果 CURLOPT_READDATA則它必須是您打開到包含要發送的數據的輸入文件的FILE*

3)如果設置了CURLOPT_READFUNCTIONCURLOPT_READDATA可以指向您的函數完成其向服務器發送數據的任務所需的任何內容。

暫無
暫無

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

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