Я собираюсь написать небольшой менеджер загрузок на С++, который поддерживает возобновление (и несколько подключений для загрузки).
Из информации, которую я собрал до сих пор, при отправке HTTP-запроса мне нужно добавить поле заголовка с ключом "Range" и значением "bytes = startoff-endoff". Затем сервер возвращает ответ http с данными между этими смещениями.
Итак, примерно то, что я имею в виду, это разделить файл на количество разрешенных подключений на файл и отправить HTTP-запрос на разделенную часть с соответствующим "диапазоном". Так что, если у меня есть файл размером 4 МБ и 4 разрешенных соединения, я бы разделил файл на 4 и пропустил 4 http-запроса, каждый из которых имел соответствующее поле "Диапазон". Реализация функции возобновления будет включать в себя запоминание того, какие смещения уже загружены и просто не запрашивать их.
- Это правильный способ сделать это?
- Что делать, если веб-сервер не поддерживает возобновление? (думаю, он будет игнорировать "Range" и просто отправить весь файл).
- При отправке HTTP-запросов следует ли указывать в диапазоне весь размер разделенного? Или, может быть, спросите более мелкие куски, скажем, 1024k за запрос?
- При чтении данных следует записать его непосредственно в файл или сделать какую-то буферизацию? Я думаю, это может быть расточительно писать небольшие куски.
- Должен ли я использовать файл с отображением памяти? Если я правильно помню, он рекомендовал для частых чтений, а не для записи (я мог ошибаться). Это память разумная? Что делать, если у меня есть несколько загрузок одновременно?
- Если я не использую файл с отображением памяти, должен ли я открыть файл для разрешенного соединения? Или когда нужно писать в файл просто искать? (если бы я использовал файл с отображением памяти, это было бы очень просто, так как я мог просто иметь несколько указателей).
Примечание. Я, вероятно, буду использовать Qt, но это общий вопрос, поэтому я оставил код из него.