我正在使用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;
}
答案 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处的连接选项。
祝你好运。