cURL: интервал ожидания простоя больше указанного значения - PullRequest
5 голосов
/ 12 ноября 2010

Я использую libcurl для создания http-соединения с сервером.Во время инициализации я указал значение времени ожидания 5 секунд, а также определил функцию обратного вызова прогресса.Я ожидал, что cURL прервет соединение через 5 секунд бездействия и прекратит вызывать обратный вызов хода выполнения, но обнаружил, что время ожидания завитка истекло примерно через 15 секунд.Почему curl тратит больше времени на тайм-аут, чем я, что я указал?Установка таймаута на большее значение не помогает.Если я укажу 100 секунд, это время ожидания после 105 секунд бездействия.

code = s_curl_easy_setopt(m_curl_handle, CURLOPT_NOPROGRESS, 0);
assert(code == CURLE_OK);
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_PROGRESSFUNCTION, progress_callback);
assert(code == CURLE_OK);

РЕДАКТИРОВАТЬ: Код таймаута

//this will set the timeout for quitting in case the network goes down
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_LOW_SPEED_LIMIT, 1);
code = s_curl_easy_setopt(m_curl_handle, CURLOPT_LOW_SPEED_TIME, m_idle_timeout);

Ответы [ 2 ]

7 голосов
/ 06 января 2011

Я понял это.cURL обновляет свой прогресс примерно раз в секунду.Чтобы рассчитать время простоя, cURL рассчитывает среднее число байтов / сек за 6 обновлений и сравнивает его с CURLOPT_LOW_SPEED_LIMIT.Если это значение меньше CURLOPT_LOW_SPEED_LIMIT в течение более CURLOPT_LOW_SPEED_TIME секунд подряд, оно истекает.Поэтому, если CURLOPT_LOW_SPEED_TIME равно 5 секундам, cURL рассчитает среднее число байтов / сек за последние 6 обновлений прогресса (около 5 секунд), а затем проверит, не меньше ли оно CURLOPT_LOW_SPEED_LIMIT, по крайней мере 5 секунд, таким образом, принимая общее времяок.10 секунд.

0 голосов
/ 12 ноября 2010

(1) Документы Libcurl на PROGRESSFUNCTION говорят:

Эта функция вызывается libcurl вместо его внутреннего эквивалента с частым интервалом во время операция (примерно раз в секунду или раньше) независимо от того, передано или нет.

(2) На какой «тайм-аут» вы ссылаетесь? Единственное, что я смог найти, было связано с тайм-аутом соединения , который не имел бы отношения к разрыву соединения после того, как оно было установлено, и данные не были отправлены - как вы, вероятно, подразумеваете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...