InternetReadFile 仅读取 10kb

Posted

技术标签:

【中文标题】InternetReadFile 仅读取 10kb【英文标题】:InternetReadFile reads only 10kb 【发布时间】:2011-07-09 06:34:24 【问题描述】:

我正在尝试使用 WinINet 库调用从 http 服务器下载文件。它在我的本地 Web 服务器上运行良好。但是当我尝试从 Internet 下载某些内容时,InternetReadFile 仅读取约 10kb 的任何文件(文本或二进制文件)。在下面的示例中,TRANSFER_SIZE = 4096,因此有两次读取 4kb 和一次读取 2kb。每个下一个 InternetReadFile 都返回 true 并读取 0 个字节。

    hInternet = InternetOpen(L"Agent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    DWORD options = INTERNET_FLAG_NEED_FILE|INTERNET_FLAG_HYPERLINK|INTERNET_FLAG_RESYNCHRONIZE|INTERNET_FLAG_RELOAD;
    HINTERNET hSession = InternetOpenUrl(hInternet, URL, NULL, NULL, options, 0);

    hFile = CreateFile(...);
    ...
    do 
         DWORD dwWriteSize, dwNumWritten;
         BOOL bRead = InternetReadFile(hSession, pBuf, TRANSFER_SIZE, &dwReadSizeOut);
         dwWriteSize = dwReadSizeOut;

         if (bRead && dwReadSizeOut > 0) 
             dwTotalReadSize += dwReadSizeOut;
             WriteFile(hFile, pBuf, dwWriteSize, &dwNumWritten, NULL); 
             // File write error
             if (dwWriteSize != dwNumWritten) 
                 CloseHandle(hFile);                    
                 return false;
             
         
         else 
             if (!bRead)
             
                 // Error
                 CloseHandle(hFile);    
                 return false;
                       
             break;
         
      while(1);

如何使用 WinINet 库下载整个文件?

【问题讨论】:

您是否运行了数据包嗅探器(NetMon、wiresark 等)来检测提供 URL 的 Web 服务器是否实际上正在向您发送您期望的字节? 我的意思是“wireshark”。即使是“提琴手”也会很有用。 InternetReadFile 在 Internet 上的行为应与在本地 Web 服务器上的行为相同。某处发生了一些变化;如果不是您的代码,请扩展您的故障排除。仔细检查来自网络服务器的响应是否符合您的预期,并且中间没有其他硬件或软件导致该行为。请参阅此问题以获取类似问题的一个很好的示例,结果令人惊讶:***.com/questions/5771636/… 是的,检查响应是解决方案。响应是 http 404 错误 - 项目中的其他人将文件移动到不同的目录 =(这太愚蠢了! @polotenchiko - 确保回答(并接受)您自己的问题,以便我们将来找到答案。 【参考方案1】:

尝试在 InternetOpenURl 上设置 INTERNET_FLAG_KEEP_CONNECTION。

您还应该在打开后在句柄上至少执行 HttpQueryInfo(HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER)。

我建议查看这些东西的一些现有包装 C++ 类, http://www.google.com/codesearch#search/&q=INTERNET_FLAG_KEEP_CONNECTION%20lang:c%2B%2B&type=cs

【讨论】:

谢谢!看起来如果我不自己写一堆代码,我就不会花那么多时间在那里寻找错误。还建议我下次使用 libcurl - 看起来不错,许可证也可以。 非常感谢您提及 INTERNET_FLAG_KEEP_CONNECTION【参考方案2】:

我将响应读取为文本,它是来自 Web 服务器的“404 错误”响应 - 文件丢失。所以阅读回复很有用;)

libcurl 看起来像是 WinINet 库的不错替代品 - 更容易上手,有很多选择。

【讨论】:

以上是关于InternetReadFile 仅读取 10kb的主要内容,如果未能解决你的问题,请参考以下文章

InternetReadFile() 似乎没有读取互联网数据

InternetReadFile() 读取数据但返回 false 并将读取的字节数设置为零

InternetReadFile 填充缓冲区,但返回读取的零字节

InternetReadFile 因分块响应而失败

InternetReadFile 的共同平均缓冲区大小是多少?

C++ WinINet InternetReadFile函数刷新