C ++ Параллельные запросы GET - PullRequest
2 голосов
/ 01 мая 2009

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

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

Какие библиотеки вы бы порекомендовали мне использовать? Libcurl? curlpp? повысить asio? нужно ли мне использовать многопоточность roll-my-own для одновременного запроса всех файлов? Есть ли более простой способ?

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

Ответы [ 2 ]

4 голосов
/ 01 мая 2009

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

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

2 голосов
/ 01 мая 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...