【问题标题】:CURL finish executing and timeoutCURL 完成执行并超时
【发布时间】:2014-06-13 09:07:43
【问题描述】:

我正在使用 C++ 中的 curl 执行服务器请求,它以片段的形式返回响应,并且这些片段的大小也可能会有所不同。

在每件作品到达时,正在调用回调函数。问题是我无法检测到连接何时完成以便对我的父类执行另一个回调。

顺便问一下,我想知道我们是否可以设置和检测 curl 的超时时间?

简而言之,这是我的代码:

CURL *curl = curl_easy_init();
curl_global_init(CURL_GLOBAL_ALL);

curl_easy_setopt(curl, CURLOPT_URL, "My URL");
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "My Postfields");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);

curl_easy_perform(curl);
curl_easy_cleanup(curl);
curl_global_cleanup();

默认回调:

size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{
    //do something
    //But how can I detect the last callback when connection finished
    //in order to call an another one?
    return size*nmemb;
}

【问题讨论】:

  • 嗯。 curl_easy_perform返回之后,保存您的数据并进行后续工作怎么样?
  • @WhozCraig:对不起,我的错。我删除了我之前的评论。看来你把我引向了正确的方向!

标签: c++ curl libcurl


【解决方案1】:

您想要的数据可以在回调期间保存,然后在curl_easy_perform 返回时使用。示例:

CURL *curl = curl_easy_init();
curl_global_init(CURL_GLOBAL_ALL);

// NOTE: added to accumulate data.
std::string result;

curl_easy_setopt(curl, CURLOPT_URL, "My URL");
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "My Postfields");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result); // NOTE: added
curl_easy_perform(curl);

// TODO: do something with your data stored in result

curl_easy_cleanup(curl);
curl_global_cleanup();

在你的写回调中:

size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{
    std::string* pstr = static_cast<std::string*>(up);
    std::copy(buf, buf+size*nmemb, std::back_inserter(*pstr));
    return size*nmemb;
}

或类似的东西。我把所有的错误检查留给你(对于任何错别字,我很抱歉;我没有编译器可以立即验证这一点)。

关于超时长度,有多种超时选项可用于简易模式 curl 请求。实在太多了,这里就不一一赘述了。请参阅curl_easy_setopt 的文档,尤其是页面下方大约 2/3 处的连接选项。

祝你好运。

【讨论】:

  • 非常感谢!它解决了这个问题。这里的关键是CURLOPT_WRITEDATA,不过我不是很理解。
  • @NhonNguyen 它是一个通用指针,curl 将把你作为一个选项(显然)并在调用你的 write- 期间将 back 作为一个粘性传递给你打回来。我们使用了本地 std::string 对象的地址,然后我们取消引用并将我们刚刚收到的所有数据附加到它。当 curl 操作完成后,我们收到的任何数据都将返回到我们的字符串中。
  • 我的意思是 CURLOPT_WRITEDATA 我不明白所以我被卡住了。但是当你给我一个例子时,我明白了!再次感谢您的澄清。你真是太好了:)
猜你喜欢
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
相关资源
最近更新 更多