仅在连接失败时使libcURL超时

时间:2016-09-16 12:14:45

标签: c++ timeout runtime-error libcurl

我在我的程序中使用了一些自动更新功能。如果连接失败,我希望程序继续尝试最多15秒,然后宣布失败。为了达到这个目的,我使用了以下curl_easy_setopt来简化cURL:

curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15);

但后来我发现,如果下载时间超过15秒,则会宣布超时错误。

如何仅将15秒限制为失败?即,如果15秒没有连接?

更多信息

我使用的完整选项列表如下:

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //verify ssl peer
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); //verify ssl hostname
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdString);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, this); //pointer to the current class as it's a GUI program
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, CurlProgress_CallbackFunc_UpdateProgress);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20);

并且通过以下方式调用start:

CURLcode res = curl_easy_perform(curl);

如果您需要更多信息,请告诉我们。

谢谢。

1 个答案:

答案 0 :(得分:4)

而不是

curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20);

使用

curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 15);

第一行是连接阶段的超时。建立连接后,超时变得无关紧要,但是以下两行确保如果15秒时间帧内的平均速度低于每秒1字节,则操作将中止。

另外值得注意的是,curl不会尝试重新建立任何连接,如果它被删除,因为如果物理连接(临时)丢失,直到其中一方决定超时,TCP连接仍然可以保持。