LINUX.ORG.RU

Libcurl использование multi_socket режима

 , ,


0

2

Здравствуйте,

Подскажите пожалуйста, уже не первый день пытаюсь, понять, как работает libcurl в multi_socket режиме - пытаясь его объединить напрямую с портом завершения IO Windows и судя по этой цитате из онлайн книги - libcurl это позволяет:

There are numerous event based systems to select from out there, >and libcurl is completely agnostic to which one you use. >libevent, libev and libuv are three popular ones but you can also >go directly to your operating system’s native solutions such as >epoll, kqueue, /dev/poll, pollset, Event Completion or I/O >[b]Completion Ports[/b]

Я перечитал эту же всю документацию из Libcurl, пересмотрел примеры на их сайте касающееся multi_socket режима, но я все равно не могу понять, как он работает.

На данный момент я:

1)Создал easy_handles. (curl_easy_init)

2)Создал multi_handle. (curl_multi_init)

3)В multi_handle установил параметры: curl_easy_setopt: CURLMOPT_SOCKETFUNCTION и CURLMOPT_TIMERFUNCTION

4)К multi_handle добавил—> easy_handles.(curl_multi_add_handle)

..После этого …

5)Вызывается колбэк функция callback_timer() (CURLMOPT_TIMERFUNCTION)

6)В этой функции call_back_timer я вызываю функцию curl_multi_socket_action().

7)Далее вызывается колбэк функция callback_socket_function (CURLMOPT_SOCKETFUNCTION):

                >int socket_callback(CURL *easy,      // easy handle
                >curl_socket_t s, // socket
                >int what,        // describes the socket
                >void *userp,     // private callback pointer
                >void *socketp);  // private socket pointer

8)Параметр "what " в callback_socket_function - приходит равный 1 == CURL_POLL_IN:

CURL_POLL_IN: ждать входящих данных. Чтобы сокет стал читаемым.

Я не понимаю, о чем в данном случае говорит вызов колбек функции callback_socket_function? Ну вызвалась они, там указан" описание сокета" в переменной what, а дальше что делать то ?

Причем судя по дебаг информации, которую предоставляет libcurl в консоль, сам libcurl - даже еще не начала попытку Connect() к удаленному серверу.

Я вообще тогда не понимаю, что этот «CURL_POLL_IN» значит и как на него реагировать.

Ответ на: комментарий от anonymous

опять этот паразит?

Оскорблять по надуманному основанию, да еще под «ником» anonymous - все равно, что выпячивать свои комплексы. Зачем ?

откройте исходники libcurl и изучите

Да открывал и до сих пор они открыты я пытаюсь проследить, как это работает, но при этом спросил дополнительно спросил на форуме, может быть кто то пытался тоже использовать этот режим в Libcurl. Разве форум не для этого создан ?

опять этот паразит?

Ну если тебе не нравится, что я создаю темы на этом форуме - удаляй их просто, смысл оскорблять просто так ?

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

смысл оскорблять просто так ?

Смысл в том, чтобы дать тебе «обратную связь» на твои поступки.

Конкретно в этой теме ты задаёшь вопрос, не понимая предмета примерно никак. А чтобы задавать вопрос надо понимать предмет.

Я перечитал эту же всю документацию из Libcurl, пересмотрел примеры на их сайте касающееся multi_socket режима, но я все равно не могу понять, как он работает.

Либо повторяй, пока не получится, либо (более вероятно) пойди и прочитай те материалы, которые необходимы для понимания.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Конкретно в этой теме ты задаёшь вопрос, не понимая предмета примерно никак.

Но, как вы это поняли ? Ведь, чтобы говорить, что я «не понимаю предмет примерно - никак» - нужно самому знать обсуждаемый предмет, я прав ?

Optimus1
() автор топика
Последнее исправление: Optimus1 (всего исправлений: 1)
Ответ на: комментарий от LamerOk

Либо повторяй, пока не получится, либо (более вероятно) пойди и прочитай те материалы, которые необходимы для понимания.

А с какой целью вы тогда создали этот форум ? Почему правила вашего форума - разрешили создать данную тему ?

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

Этот форум (как и весь мир вокруг) не созданы, чтобы помогать тебе.

Но, если ты будешь учиться, то, возможно, сможешь извлечь некоторую пользу для себя.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Этот форум (как и весь мир вокруг) не созданы, чтобы помогать тебе.

Так с какой целью вы создали этот форум и почему не удалите тему тогда ?

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

Конкретно в этой теме ты задаёшь вопрос, не понимая предмета примерно никак.

Но, как вы это поняли ? Ведь, чтобы говорить, что я «не понимаю предмет примерно - никак» - нужно самому знать обсуждаемый предмет, я прав ?

Вы сами использовали режим multi_socket в Libcurl или нет ?

Optimus1
() автор топика

Мне когда-то довелось разбираться с curl_multi. Это было непросто, т.к. нормальных описаний в Интернетах не было (либо мое Гугл-фу совсем отстой). Результаты когда-то описывал здесь: раз и два. Посмотрите, может чем-то это вам поможет.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Мне когда-то довелось разбираться с curl_multi. Это было >непросто, т.к. нормальных описаний в Интернетах не было (либо мое >Гугл-фу совсем отстой). Результаты когда-то описывал здесь: раз и >два. Посмотрите, может чем-то это вам поможет.

Спасибо большое!! Странно, что гугл мне не разу не выдал ссылку на Вашу статью.

Не очень хитрый callback: timer_function С ним все более-менее просто.

По моему - это самый хитрый и сложный callback из трех. :)

Optimus1
() автор топика
Ответ на: комментарий от eao197

Мне когда-то довелось разбираться с curl_multi. Это было >непросто, т.к. нормальных описаний в Интернетах не было (либо мое >Гугл-фу совсем отстой). Результаты когда-то описывал здесь: раз и >два. Посмотрите, может чем-то это вам поможет.

Если я правильно сделал вывод из Вашей стать, то он заключается в том, что саму операцию отправки и чтения, то есть вызов функций Send/Recv - осуществляет Libcurl и только Libcurl, но, если это так, то Ваше утверждение насчет IOCP:

А нам нужно узнать о том, что эти сокеты созданы, мы должны >получить их дескрипторы, и мы должны запихнуть дескрипторы этих >сокетов в какой-то свой механизм event-loop-а (будь то select, >epoll, kqueue, IOCP).

Кажется не выполнимым, так как IO Completion Port работает только в связке с WSASend/WSARecv, а внутри Libcurl вызовов таких функций - нет.

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

В общем факты дела оказались таковы:

-Как я понял автор Libcurl - сам до конца не знает, как работает режим multi_socket(не путать с просто multi) Libcurl, поэтому в своей книге утверждение о том, что Libcurl может работать на прямую с IO Completion Ports Windows - написано основываясь на слухах, а не понимании работ multi_socket Libcurl совместно Windows IOCP.

В подтверждении этого, основываясь не на слухах, а на фактах:

0.В любом из режимов Libcurl - curl_easy, curl_multi и multi_socket, записью и чтением, отправкой и приемом, то есть вызовом функций Send() и Recv() - управляет только Libcrul.

1.MSDN говорит следующее: MSDN IO Completion Ports

Следующие функции могут использоваться для запуска операций >ввода-вывода, которые завершаются с использованием портов >завершения ввода-вывода. Вы должны передать функции экземпляр структуры >OVERLAPPED и дескриптор файла, ранее связанный с портом >завершения ввода-вывода (путем вызова CreateIoCompletionPort ), >чтобы включить механизм порта завершения ввода-вывода:

ConnectNamedPipe

DeviceIoControl

LockFileEx

ReadDirectoryChangesW

ReadFile

TransactNamedPipe

WaitCommEvent

WriteFile

WSASendMsg

WSASendTo

WSASend

WSARecvFrom

LPFN_WSARECVMSG (WSARecvMsg)

WSARecv

Как видно функций Send() и Recv() - нет в списке тех, которые могут работать c IOCP Windows.

Просмотрев Все исходные файлы Libcurl - я не нашел использование Libcurl`ом функций WSASend(), WSARecv() - в исходный файлах их нет.

2.Так же посмотрев пример на сайте Libcrul о использовании режима multi_socket совместно с Libevent: https://curl.se/libcurl/c/multi-event.html ,который кстати заявляет, что для платформы Win32 использует наиболее эффективный метод - IOCP, и запустив этот пример в дебаг режиме - увидел, что Libevent использует обычный Select() и ни о каком IOCP речи нет и быть не может в связи с п.1.

ЗЫ: В общем кругом ложь и обман - никому доверять нельзя :)

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

слышь долгопупик

если ты не в состоянии сбилдить libevent с iocp, это не означает что она его не поддерживает

а сама libcurl не обязана поддерживать iocp, она предоставляет коллбеки через которые она может подцепить любой реактор или проактор

но тебе еще до таких терминов этого очень далеко

anonymous
()
Ответ на: комментарий от LamerOk

Либо повторяй, пока не получится, либо (более вероятно) пойди и прочитай те материалы, которые необходимы для понимания.

+10500

anonymous
()
Ответ на: комментарий от Optimus1

может быть кто то пытался тоже использовать этот режим в Libcurl.

Очевидно. Непонятно только, почему ты решил искать его среди русскоговорящих, так их может оказаться полтора.

Разве форум не для этого создан?

Нет, ты все правильно делаешь. Полюбому linux.org.ru создан, чтобы ты оскорблял комментом выше его участников за недостаточной опыт использования экзотического режима libcurl на винде. --sarcasm

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Непонятно только, почему ты решил искать его среди русскоговорящих

А, что в твоем понимании - русскоговорящие ничего не умеют и у них нечего спросить ? Ты русофоб ?

Полюбому linux.org.ru создан, чтобы ты оскорблял комментом выше >его участников за недостаточной опыт использования экзотического >режима libcurl на винде

Прикол да ? Ананимус и Серега LamerOK - настолько ущербные, что не зная технологии и боясь за свой маленький размер, начали повышать свой ЧСВ - оскорбляя меня, лишь бы их маленькое чувство собственной важности не исчезло совсем ;) У тебя тоже маленький орган? И ты тоже решил компенсировать размеры ? ;)

Полюбому

«ПОлюбому» ? Я так понимаю ты не русскоговорящий ?

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

У меня умение гуглить, умение разбираться и нежелание ограничиваться 2% мира. Чего и тебе желаю в счастливом новом году.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 2)
Ответ на: комментарий от t184256

У меня умение гуглить

Не заметил у тебя этого. Но, спасибо за информацию, хотя и не понятно зачем она мне.

умение гуглить, умение разбираться и нежелание ограничиваться 2% мира. Чего и тебе желаю в счастливом новом году.

Благодарю.

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

у Анонима опыта кодинга >15 лет

а у Оптимуса1 чуть больше месяца

почувствуйте разницу, как в анекдоте

Стоят опытный Аноним и молоденький Оптимус1. Мимо проходят десяток девченок. Молодой Оптимус1 пихает Анонима под бок: "Ну давай, ну давай быстренько вот ту, молоденькую, тр. или вот ту, стройненькую. Ну давай, быстренько. ". Опытный Аноним долго слушает, качает головой, потом говорит: «Нет, мы медленно подойдем к ним и медленно от%%%%ем всех».

anonymous
()
Ответ на: комментарий от anonymous

опыта кодинга >15 лет

Когда, кто то апеллирует к возрасту или к временному отрезку, очевидно только одно, что у это индивидуума - ничего нет, кроме, как потраченного времени, особенно, если это аноним. Не зря говорят - «седина не признак ума»(с)

у Оптимуса1 опыт кодинга в среднем 3 года.

у Анонима опыта кодинга меньше 2 месяцев.

Мимо проходят десяток девченок.

ДевчонOк ;) Ты даже правильно слово девчонки написать не можешь, что ты еще правильно с ними делать не умеешь ? ;)

почувствуйте разницу, как в анекдоте:

Стоят Оптимус1 и стеснительный закомплексованный Аноним. Мимо проходят десяток девчонOк. Закомплексованный Аноним пихает Оптимуса под бок: "Ну давай, ну давай быстренько вот ту, молоденькую, тр. или вот ту, стройненькую. Ну давай, быстренько. ". Опытный Оптимус долго слушает, качает головой, потом говорит: «Нет, мы медленно подойдем к ним и медленно от%%%%ем всех … но посмотрев на стручок Анонима, добавил: «Анонишка, ты походу в пролете…»

Optimus1
() автор топика
Ответ на: комментарий от Optimus1

Аноним никогда не бегал по форумам с тупыми вопросами - а каг?

Оптимус1 бегает, пищит, возмущается, упирается своими рогами - только бы не самому вникнуть и разобраться

anonymous
()
Ответ на: комментарий от anonymous

Аноним никогда не бегал по форумам с тупыми вопросами

Без понятия, на то он и стеснительный аноним с опытом не более 2 месяцев кодинга.

Optimus1
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.