Вопрос

Я пишу приложение на C++ и хотел бы одновременно запросить несколько файлов данных с помощью HTTP-запроса GET. Где мне следует начать работу (должна быть кросс-платформенной).

  1. Запустить приложение
  2. Создайте список URL-адресов { "http://хост/file1.txt", "http://хост/file2.txt", "http://хост/file3.txt"}
  3. Запросите все URL-адреса одновременно и загрузите содержимое в переменные (не требуется запись на диск).Каждый файл содержит около 10 КБ данных.

Какие библиотеки вы бы порекомендовали мне использовать?либкерл?керлпп?увеличить asio?нужно ли мне использовать собственную многопоточность, чтобы запрашивать все файлы одновременно?есть ли более простой способ?

Редактировать:Мне нужно будет запросить около 1000 GET-запросов одновременно.Скорее всего я буду делать это партиями (по 100 за раз, и создавать больше соединений по мере выполнения одного).

Это было полезно?

Решение

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

В зависимости от того, какое решение вы выберете, можно выполнять асинхронный ввод-вывод без использования многопоточности.Ключевым моментом является использование select(2) системный вызов. select() принимает набор файловых дескрипторов и сообщает, есть ли в каком-либо из них данные.Если да, то вы можете продолжить использование read(2) или recv(2) на них, не беспокоясь о блокировке.

Другие советы

Веб-браузеры часто поддерживают пул рабочих потоков для загрузки и назначают им загрузки по мере их освобождения.IIRC в HTTP RFC есть что сказать о том, сколько одновременных подключений вы должны установить к одному и тому же серверу одновременно:слишком много – это грубо.

Если несколько запросов направляются на один и тот же сервер, и он поддерживает поддержку активности (что делает почти каждый), то это может быть лучшим поведением, чем рассылка спама с несколькими одновременными запросами.Общая идея заключается в том, что вы используете одно соединение TCP/IP для нескольких последовательных запросов, тем самым экономя накладные расходы на подтверждение связи.Практический результат, по моему опыту реализации классов Java HTTPConnection, заключается в том, что вы вносите тонкую ошибку, связанную с тем, что состояние не всегда правильно очищается при повторном использовании соединения для нового запроса, и тратите значительное время на просмотр журнала/сниффера. данные ;-)

libcurl, безусловно, поддерживает поддержку активности (я думаю, включено по умолчанию).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top