libcurl:curl_easy_perform阻止,除非设置了CURLOPT_READFUNCTION

时间:2018-05-28 20:28:54

标签: c++ rest http libcurl

我正在尝试使用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);

注意:上面更改了一些编码数据。

非常感谢任何帮助。

谢谢, ķ

1 个答案:

答案 0 :(得分:1)

根据The Manual ...

  

CURLOPT_READFUNCTION解释

     

...

     

如果将此回调指针设置为NULL,或者根本不设置它,则将使用默认的内部读取功能。它正在使用CURLOPT_READDATA对FILE * userdata进行fread()。

但是,您也没有设置CURLOPT_READDATA。再看看The manual ......

  

CURLOPT_READDATA解释

     

...

     

默认情况下,这是stdin的FILE *。

所以你的节目"挂起"似乎是因为它正在等待某些内容到达标准输入 stdin

所以它的工作方式就是这个。

1)如果您 nothing ,发送到服务器的数据来自标准输入(通常是键盘)。< / p>

2)如果您只设置 CURLOPT_READDATA,那么必须是您打开输入的FILE*包含您要发送的数据的文件。

3)如果设置CURLOPT_READFUNCTION,那么CURLOPT_READDATA可以指向您的功能需要完成向服务器发送数据的任务