LINUX.ORG.RU

Сообщения Optimus1

 

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

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

Подскажите пожалуйста, уже не первый день пытаюсь, понять, как работает 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» значит и как на него реагировать.

 , ,

Optimus1
()

libcurl - опция CURLOPT_WRITEFUNCTION

Позвольте спросить и тут несколько вопросов по опции licurl:

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

  1. Вопрос по CURLOPT_WRITEFUNCTION:—–>

В документации сказано:

Функция обратного вызова будет передавать как можно больше >данных >при всех вызовах, но вы не должны делать никаких >предположений. >Это может быть один байт, а может быть и тысячи. >Максимальный >объем данных тела, который будет передан функции >обратного вызова >записи, определен в файле заголовка curl.h : >CURL_MAX_WRITE_SIZE >(обычное значение по умолчанию - 16 КБ). >Если CURLOPT_HEADER >включен, что позволяет передавать данные >заголовка в обратный >вызов записи, вы можете получить до >CURL_MAX_HTTP_HEADER байтов >данных заголовка, переданных в >него. Обычно это означает 100К.

-Под 100К - имеется ввиду все тот же размер данных за один приход ? -Написано, что «Если CURLOPT_HEADER включен, то позволяет … 100К». Однако в документации к CURLOPT_HEADER сказано, что не опция CURLOPT_HEADER поддерживает 100K, а опция обратного вызова для заголовков CURLOPT_HEADERFUNCTION поддерживает 100K. Это небольшая неточность в документации ?

  1. Вопрос по CURLOPT_HEADER:—–>

Далее: обратный вызов CURLOPT_WRITEFUNCTION ограничен только >получением максимального количества переданных ему байтов >CURL_MAX_WRITE_SIZE (16 КБ), в то время как заголовок может быть >длиннее, а CURLOPT_HEADERFUNCTION поддерживает вызов с >заголовками до CURL_MAX_HTTP_HEADER bytes (100KBB).

-Подскажите, тут имеется ввиду, то, то заголовок может быть более 16K и его получение просто займет больше вызовов обратной функции CURLOPT_WRITEFUNCTION ? То есть грубо говоря ничего потеряно не будет, просто call-back будет вызываться чаще, так как принимает более маленькими порциями ?

  1. И еще один вопрос по опции CURLOPT_WRITEFUNCTION:

Эта функция может быть вызвана с нулевыми байтами данных, если >переданный файл пуст. Данные, передаваемые в эту функцию, не >будут завершаться нулевым символом в конце!

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

В чистых сокетах или портах завершения Windows, если функция WSARecv вызывалась с нулевыми данными - это значило, что соединение разварено со стороны севера. Тут то же самое или что то другое ? Главный вопрос, как на это нужно реагировать ?

 ,

Optimus1
()

libcurl - CURLOPT_WRITEFUNCTION - Странный параметр size

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

Из документации Libcurl опции CURLOPT_WRITEFUNCTION:

size_t write_callback(char *ptr, size_t size, size_t nmemb, void >*userdata);

Эта функция обратного вызова вызывается libcurl, как только будут >получены данные, которые необходимо сохранить. Для большинства >передач этот обратный вызов вызывается много раз, и каждый вызов >доставляет еще один фрагмент данных. ptr указывает на >доставленные данные, размер которых равен nmemb ; размер всегда >равен 1.

А зачем этот параметр вообще нужен, если он всегда равен 1 ?

 ,

Optimus1
()

Подключение исходных файлов к проекту - на примере Libcurl

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

Я уже понимаю, что так никто не делает, но мне все таки интересно сделать именно так.

Не собирать библиотеку в бинарный файл под конкретную IDE/компилятор, под конкретную ОС, с конкретными параметрами и зависимостями, а подключить к проекту именно исходные файлы библиотеки, ведь в них содержится вся реализация, правильно ??

Интересно то мне интересно, но не получается:

-Скачал исходники libcurl с их сайта: https://curl.se/download.html

-Создал свой проект в VS2019 и добавил туда все хедер файлы из папки libcurl/include.

-В проекте сделал include основного хедера и вызвал самою первую функцию инициализации libcurl:

#include <iostream>
#include "curl.h"
 
int main()
{
 
std:cout<<"Hello libcurl"<<std::endl;
 
 
    CURL* curl;
    CURLcode res;
 
    curl = curl_easy_init();
}

Естественно - этого не достаточно, а VS выдает ошибку «ссылка на неразрешённый внешний символ __imp__curl_easy_init в функции _main.»

То есть VS вроде, как определение curl_easy_init - нашел, а вот саму, как я понимаю реализацию этой функции нет ?

И если примерно все так, вот и вопрос, а где найти эту реализацию, в каких файлах ??? И как его добавить в проект VS2019 ?

Может кто нибудь может подсказать ?

PS: Libcurl - позиционируется, как opensource библиотека, теоретически файлы реализации должны быть открытыми ?

 , ,

Optimus1
()

Аналог winapi-шной getaddrinfoex в Linux

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

Подскажите пожалуйста, есть ли в Linux’e аналог винапишной функции getaddrinfoex, которая в свою очередь является рамширением стандартной функции getaddrinfo из сокетов для запроса соответсвия URL адресса —> ip адрессу в асинхронном режиме, а не в блокирующем, как getaddrinfo ?

 , ,

Optimus1
()

Boost asio для начинающих

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

Начал попытку изучить основы boost asio и и сразу же появились вопросы :( Если есть возможность подскажите пожалуйста:

1)Я так и не могу понять, как работает функция read, то есть, как они понимает, что чтение пора завершать и передавать действие следующей строчке кода ? Единственно, что я смог заметить, это, если делать get http запрос в сторону сервера и указать Connection: close, то чтение read`ом происходит сразу и быстро, если же не указать Connection: close, то функция «чего то» ждет секунд 30 и только потом завершается. Из этого получаются еще вот такие вопросы: 2)Судя по всему функция read ждет отключения соединения со стороны сервера и только после этого считает, что все данные считаны, потому что у read_untill такой «проблемы» нет.

И иcходя из этого еще получаются вот такие вопросы: 3)Вообще по http 1.1, если я правильно понимаю, если не указать Connection: close, то сервер не должен закрывать соединение и должен его держать чуть ли не до второго пришествия, но в моем случае, соединение скорее всего закрывалось, хотя сервер и присылал «Connection: keep-alive», вопрос почему ? Или все таки это было не закрытие присоединения ?

4)И что такие вообще закрытие присоединения со стороны сервера , что это значит ? То есть, я создаю обьект boost socket, socket.open(), socket.conection() далее пишу в сокет, get запрос, пишу Connection: close, чтобы сервер закрыт соединение после того, как передаст всю инфу на мой get запрос, далее от сервера приходит так же Connection: close. Далее я проверю открыт ли мой сокет:

cout<< socket.is_open()<<endl;

И ответ: 1

то есть сокет открыт, что тогда такое Connection: close ??

5)Если в http 1.1 предусмотрен режим постоянного соединения, то, возвращаясь к самому первому вопросу, как работает read, как read понимает, или должен понимать, что все данные записаны и пора передавать команду следующей строчки кода ?

Как то вот такие вопросы получились, не судите строга пожалуйста :)

 ,

Optimus1
()

RSS подписка на новые темы