我在我的程序中使用了一些自动更新功能。如果连接失败,我希望程序继续尝试最多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);
如果您需要更多信息,请告诉我们。
谢谢。
答案 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连接仍然可以保持。