恢复简单下载管理器的能力(C ++ - WinInet)

时间:2014-09-23 04:00:41

标签: c++ winapi download wininet resume

我正在写一个非常简单的下载管理器,它可以Download - Pause - Resume, 怎么可能从之前停止的文件的确切位置resume下载,实际上我唯一想要的是如何在服务器端设置文件指针然后我可以从 InternetReadFile (Any Other Functions are accepted if you know a better way for it)我想要的确切点。 虽然,InternetSetFilePointer Never works for me :)我不想使用 BITS 。 我认为这可以通过发送标题来实现,但不知道发送它的方式和方式。

1 个答案:

答案 0 :(得分:2)

您正在寻找Range标题。使用HttpAddRequestHeaders()添加自定义Range请求标头,告知服务器您需要的字节范围。有关语法,请参阅RFC 2616 Section 14.35

如果服务器支持范围(使用HttpQueryInfo(HTTP_QUERY_ACCEPT_RANGES)进行验证),它将发送206状态代码而不是200状态代码(使用HttpQueryInfo(HTTP_QUERY_STATUS_CODE)进行验证)

如果收到206,只需将您现有的文件搜索到恢复位置,然后按原样读取您的文件中的响应数据。

如果收到200,则文件从头开始,所以:

  1. 截断现有文件并开始重新编写

  2. 寻找文件,读取并丢弃响应数据,直至到达所需位置,然后将剩余数据读入您的文件。

  3. 将任何其他状态代码视为下载失败。