Зачем изменять возвращаемое значение curl_multi_timeout()?

#c #curl #libcurl

#c #curl #libcurl

Вопрос:

Этот пример кода содержит:

 curl_multi_timeout(multi_handle, amp;curl_timeo);
if(curl_timeo >= 0) {
  timeout.tv_sec = curl_timeo / 1000;
  if(timeout.tv_sec > 1)
    timeout.tv_sec = 1;
  else
    timeout.tv_usec = (curl_timeo % 1000) * 1000;
}
  

Почему tv_sec значение ограничено 1 секундой? Почему значение, возвращаемое curl_multi_timeout() , не используется как есть (после деления на 1000)?

Предполагая, что для вышеуказанного есть веская причина, тогда есть ли случай, когда вы НЕ стали бы обрезать значение до 1 секунды? О каком случае идет речь?

Ответ №1:

Код просто устанавливает максимальное время ожидания для последующего вызова select() . Во всяком случае, это похоже на ошибку. Похоже, что код защищает себя от необоснованного ответа от curl_multi_timeout() . Я предполагаю, что программист подумал: «если функция curl timeout возвращает что-то длиннее одной минуты, тогда не ждите дольше этого» . …а затем продолжил опечатывать одну минуту как одну секунду. Вероятно, это должно выполняться

 if (timeout.tv_sec > 60) {
    timeout.tv_sec = 60;
else if (timeout.tv_sec == 0) {
    timeout.tv_usec = curl_timeo * 1000;
}
  

Изменение на 1000 не требуется, поскольку curl_multi_timeout() возвращает миллисекунды, поэтому, если tv_sec равно нулю, это означает, что возвращаемое значение находится в диапазоне от 0 до 999.

Комментарии:

1. Но tv_usec — это микросекунды. Если curl_timeo равно миллисекундам, то вам действительно нужно умножить на 1000. Это просто мод, который кажется неправильным. Верно?

2. @Paul: Нет, tv_usec — это тоже миллисекунды — вам не нужен дополнительный коэффициент 1000. Если вы использовали микросекунды, вы используете a, у struct timespec которого есть tv_nsec член на микросекунды. Код использует более старое struct timeval .

3. Нет, tv_usec действительно равен микросекундам: ‘u’ — это префикс SI для micro. Среди других мест: gnu.org/s/hello/manual/libc/Elapsed-Time.html

4. это также означает, что мод верен: 1001 мс = 1 секунда (curl_timeo / 1000) плюс 1000 мс (curl_timeo % 1000 * 1000).

5. @Paul: Вы правы, это микросекунды (1/1 000 000-я доля секунды). Возврат времени ожидания curl составляет 1/1 000 тыс., а затем оно должно быть преобразовано в миллисекунды для tv_usec … умножение на 1000 выполняется правильно. Я отредактировал приведенный выше код, чтобы учесть это.