CURL完成执行并超时

时间:2014-06-13 09:07:43

标签: c++ curl libcurl

我正在使用C ++中的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;
}

1 个答案:

答案 0 :(得分:2)

您需要的数据可以在回调期间保存,然后在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_easy_setopt的文档,特别是大约在页面下方2/3处的连接选项。

祝你好运。