timer_callback(CURLM *multi, long timeout_ms, void *userp)
{
//какой то код
}
curl_multi_setopt(curl_multi_handle, CURLMOPT_TIMERFUNCTION, timer_callback);
Некоторые функции, такие как таймауты и повторные попытки, требуют вызова libcurl, даже если дескрипторы файлов не выполняются.
Нафига ??
Значение timeout_ms, равное -1, переданное этому обратному вызову, означает, что вы должны удалить таймер. Все остальные значения являются допустимыми сроками действия в миллисекундах.
Переданное кем ?? Я что должен этот кол-бэк еще вызывать ?? Зачем и откуда ???
Ваша функция обратного вызова timer_callback должна установить неповторяющийся таймер со временем истечения timeout_ms миллисекунд. Когда сработает этот таймер, вызовите либо curl_multi_socket_action, либо curl_multi_perform , в зависимости от того, какой интерфейс вы используете.
Зачем мне вызывать curl_multi_socket_action() из кол-бэка таймера, если мне нужно его вызвать из той части когда, где сработало событие на сокете от ОС — оповещающее меня, что сокет готов или к записи или к чтению и в этот момент я бы и вызвал curl_multi_socket_action(). На какой черт нужны какие то таймеры или откуда их вызывать то ???
И зачем тогда вообще вызывать таймер, если можно сразу вызвать curl_multi_socket_action()??
Ваша функция обратного вызова timer_callback должна установить неповторяющийся таймер...
Что значит не повторяющийся ? А если он повторится ?
Или я полный идиот или документация либкурл так "хорошо" написана, специально, чтобы поменьше народу им использовалось.
Я просто реально физически не могу представить в каком месте кода при осуществлении к примеру GET запроса — этот чёртов таймер должен быть, как то вызван и зачем.
- купить книгу — гугл для чайников, и читать до просветления
— когда просветление наступит и найдете готовые примеры использование, прочитать их от начала до дна
— если ничего не поняли, пройти на курсы выпечке печенек или курсы работы веником, разнорабочие нынче тоже нужны,а кодинг это не ваше, смиритесь уже
Re[2]: Libcurl - как работает параметр CURLMOPT_TIMERFUNCTION
Здравствуйте, reversecode, Вы писали:
R>- купить книгу — гугл для чайников, и читать до просветления R>- когда просветление наступит и найдете готовые примеры использование, прочитать их от начала до дна R>- если ничего не поняли, пройти на курсы выпечке печенек или курсы работы веником, разнорабочие нынче тоже нужны,а кодинг это не ваше, смиритесь уже
Спасибо, а по существу заданных вопросов — что нибудь есть ? Или вы из поварих в кодинг пришли ?
Re[3]: Libcurl - как работает параметр CURLMOPT_TIMERFUNCTION
Здравствуйте, Optimus1, Вы писали:
O>Здравствуйте, reversecode, Вы писали:
R>>- купить книгу — гугл для чайников, и читать до просветления R>>- когда просветление наступит и найдете готовые примеры использование, прочитать их от начала до дна
O>Спасибо, а по существу заданных вопросов — что нибудь есть ? Или вы из поварих в кодинг пришли ?
R>>- если ничего не поняли, пройти на курсы выпечке печенек или курсы работы веником, разнорабочие нынче тоже нужны,а кодинг это не ваше, смиритесь уже
Небольшие размеры свои таким образом компенсируешь ? Смирись уже, таким образом ты не увеличишь
Re: Libcurl - как работает параметр CURLMOPT_TIMERFUNCTION
Здравствуйте, Optimus1, Вы писали:
O>Я допускаю, что я полный тугодум, но я ни черта не могу понять, как работает параметр CURLMOPT_TIMERFUNCTION в либкурле: https://curl.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html
Можно просто на пример внимательно посмотреть:
static gboolean timeout_cb(gpointer user_data);
static int timerfunc(CURLM *multi, long timeout_ms, void *userp) ;
curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, timerfunc); // утанавливают обработчик таймеров
//-----------------------------------------------------------------------------------------------static int timerfunc(CURLM *multi, long timeout_ms, void *userp) { // тут библиотека дёрнет эту функцию когда захочет создать таймер (или пристрелить существующий)
guint *id = userp;
if (id) g_source_remove(*id); // первый раз пустоif(timeout_ms == -1) { g_free(id); id = NULL; }
else {
if(!id) id = g_new(guint, 1);
*id = g_timeout_add(timeout_ms, timeout_cb, id); // организуем вызов через timeout_ms
}
curl_multi_setopt(multi, CURLMOPT_TIMERDATA, id); // задаём userp для последующих вызывов либо 0 если убралиreturn 0;
}
//-----------------------------------------------------------------------------------------------static gboolean timeout_cb(gpointer user_data) { // как только таймер вышел (это уже от реализации ваших таймеров зависит)int running;
if(user_data) {
g_free(user_data);
curl_multi_setopt(curl_handle, CURLMOPT_TIMERDATA, NULL); // освобождаем таймер если еще не успели (например насильно)
}
// https://curl.se/libcurl/c/curl_multi_socket_action.html
// 6. Call curl_multi_socket_action(..., CURL_SOCKET_TIMEOUT, 0, ...) to kickstart everything. To get one or more callbacks called.
curl_multi_socket_action(multi, CURL_SOCKET_TIMEOUT, 0, &running);
return G_SOURCE_REMOVE;
}
O>Нафига ??
Видимо для того чтобы вы могли свои таймеры использовать.
O>Переданное кем ?? Я что должен этот кол-бэк еще вызывать ?? Зачем и откуда ???
Его будет вызывать библиотека. Для того что бы использовать вашу реализацию таймеров.
O>Зачем мне вызывать curl_multi_socket_action() из кол-бэка таймера, если мне нужно его вызвать из той части когда, где сработало событие на сокете от ОС — оповещающее меня, что сокет готов или к записи или к чтению и в этот момент я бы и вызвал curl_multi_socket_action(). На какой черт нужны какие то таймеры или откуда их вызывать то ??? O>И зачем тогда вообще вызывать таймер, если можно сразу вызвать curl_multi_socket_action()?? to kickstart everything
O>Что значит не повторяющийся ? А если он повторится ?
Имеется ввиду одноразовый. Вышло время один раз вызвали. Одного раза достаточно
O>Или я полный идиот или документация либкурл так "хорошо" написана, специально, чтобы поменьше народу им использовалось.
Просто следует её читать утром, а не вечером. Возможно просто устали.
O>Я просто реально физически не могу представить в каком месте кода при осуществлении к примеру GET запроса — этот чёртов таймер должен быть, как то вызван и зачем.
Видимо нужна была такая гибкость.
Re[4]: Libcurl - как работает параметр CURLMOPT_TIMERFUNCTION
Здравствуйте, reversecode, Вы писали:
R>если вы интеллектуальный импотент не способный разобраться во множественных примерах которые находятся папочке examples библиотеки libcurl
Так я оказался прав похоже, ты не только компенсируешь свои маленькие размеры, но твой маленький размер — еще и не работоспособный )))))
Бедняга, тебе девушка так же сказала, когда увидела твоего импотентного малыша — уйди прочь и смирись ? Теперь ты обиженный — всем это будешь повторять ?
Смирись уже
_>Видимо для того чтобы вы могли свои таймеры использовать.
Спасибо за ответы!
Я просто пытался сравнивать свою простенкькую реализацию клиента http 1.1 на win-сокетах на порте завершения IO, у меня не было ни каких таймеров, ну то есть все работает и без таймеров.
-Просто создается порт завершения, обработчик порта завершения.
-Создается очередь сокетов, сокет инициализируется, делается resolve DNS если нужно, connect, сокет связывается с портов завершения и вызывается WSASend/WSARecv
-И в обработчике порта завершения ловятся готовые события на сокете, которыми меня оповещается ОС — и я соответвенно реагирую на них.
Я пытался понять, как, где и зачем — тут может понадобится таймер, так как предполагал, что плюс-минус Libcurl наверное должен быть устроен как то так же
Буду разбирается дальше.
Re[3]: Libcurl - как работает параметр CURLMOPT_TIMERFUNCTION
Здравствуйте, Optimus1, Вы писали:
O>Я пытался понять, как, где и зачем — тут может понадобится таймер, так как предполагал, что плюс-минус Libcurl наверное должен быть устроен как то так же O>Буду разбирается дальше.
libcurl идет в составе некоторых ОС(например Win10), используется во множестве проектов, поддерживает десятки протоколов, нуу, так себе пример для сравнения со своей простой реализацией.
Re[4]: Libcurl - как работает параметр CURLMOPT_TIMERFUNCTION
Здравствуйте, Mr.Delphist, Вы писали:
MD>Здравствуйте, Optimus1, Вы писали:
I>>>нуу, так себе пример для сравнения со своей простой реализацией. O>>С простой реализацией чего ?
MD>Видимо, речь про это?
O>>Я просто пытался сравнивать свою простенкькую реализацию клиента http 1.1
MD>Заодно проверить, умеет ли "своя" реализация во все эти редиректы, кэши, chunked-трансферы, multipart, ranges, content encoding и прочая, и прочая
Вы не поняли, я сравнивал реализацию не протокола http — своя — libcurl, я собственно за этим libcurl и взял, потому что понял, что даже http 1.1 реализовать со Всеми нюансами не мало времени уйдет, а уже давно есть http2, и тут уже http3 вроде уже принят и реализовывать это самому — ну это до второго пришествия.
Я сравнивал работу системы событий и то, что я не использовал таймеры для ее работы, вот, что я сравнивал.