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

根据The Manual...

CURLOPT_READFUNCTION explained

...

If you set this callback pointer to NULL, or don't set it at all, the default internal read function will be used. It is doing an fread() on the FILE * userdata set with CURLOPT_READDATA.

不过你也没有设置CURLOPT_READDATA。所以再看看 The manual...

CURLOPT_READDATA explained

...

By default, this is a FILE * to stdin.

所以您的程序“挂起”的原因似乎是因为它正在等待某些东西到达标准输入 stdin.

所以它应该是这样工作的。

1) 如果你什么都不做发送到服务器的数据来自标准输入(通常是键盘)。

2) 如果你只设置 CURLOPT_READDATA那么它必须 a FILE* 您打开了一个包含您要发送的数据的输入文件。

3) 如果你设置 CURLOPT_READFUNCTION 那么 CURLOPT_READDATA 可以指向任何东西 你的函数 需要完成它的任务是向服务器发送数据。