2016-09-16 1 views
1

Я использую функцию автообновления в своей программе. В случае сбоя подключения я хотел бы, чтобы программа продолжала пробовать до 15 секунд, а затем объявляла о сбое. Для того, чтобы достичь этого, я использовал следующий curl_easy_setopt для Curl простой вариант:сделать тайм-аут libcURL только при сбое подключения

curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15); 

Но потом я обнаружил, что если загрузка занимает более 15 секунд, объявляется ошибка тайм-аута.

Как я могу ограничить 15 секунд только случаем отказа? I.e., если нет связи в течение 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); 

и призыв начать осуществляется через:

CURLcode res = curl_easy_perform(curl); 

Если вам требуется дополнительная информация, пожалуйста, я знаю.

спасибо.

+0

@ Eichhörnchen Пробовал это ... он этого не делает ... это, по-видимому, только для первоначальной связи. Чтобы быть ясным, я физически отключу свое интернет-соединение и посмотрю, имеет ли это эффект. –

+0

@ Eichhörnchen Это работает! Благодаря! –

ответ

2

Вместо

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 байт в секунду, операция прекращается.

Также стоит отметить, что завиток не будет пытаться восстановить какое-либо соединение, если оно было удалено, поскольку соединение по-прежнему сохраняется, если физическое соединение (временно) потеряно до тех пор, пока одна из сторон не решит тайм-аут.

Смежные вопросы