2014-09-23 4 views
-2

Я пишу очень простой менеджер загрузки, который только может Download - Pause - Resume, , как это можно resume загрузка с точной точкой файла, остановитесь раньше, ну, на самом деле, единственное, что я ищу, это установить указатель файла на стороне сервера, а затем я могу загрузить его с точной точки, которую я хотел получить InternetReadFile(Any Other Functions are accepted if you know a better way for it). Хотя, InternetSetFilePointer Never works for me :) и я не хочу использовать BITS. Я думаю, что это может произойти, отправив заголовок, но не знаю, что и как его отправить.Резюме Возможности для простого Download Manager (C++ - WinInet)

ответ

1

Вы ищете заголовок Range. Используйте HttpAddRequestHeaders(), чтобы добавить пользовательский заголовок запроса Range, сообщающий серверу, какой диапазон байтов вы хотите. См. RFC 2616 Section 14.35 для синтаксиса.

Если сервер поддерживает диапазоны (использовать HttpQueryInfo(HTTP_QUERY_ACCEPT_RANGES) для проверки), он будет посылать код 206 статуса вместо код в 200 состояния (используйте HttpQueryInfo(HTTP_QUERY_STATUS_CODE) для проверки).

Если получено 206, просто найдите существующий файл в положение резюме, а затем прочитайте данные ответа как есть в вашем файле.

Если 200 принимается, файл начинает все с начала, так как:

  1. укоротить существующий файл и начать писать его свежим

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

Рассматривается любой другой код состояния как сбой при загрузке.