InternetReadFile只读取了10kb的数据

3

我正在尝试使用WinINet库调用从http服务器下载文件。在我的本地Web服务器上,它运行得非常完美。但是当我尝试从互联网下载东西时,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库下载整个文件?

2
你是否运行过数据包嗅探器(NetMon、Wireshark等)来检测Web服务器是否实际发送了你期望的字节? - selbie
我的意思是“wireshark”。即使是“fiddler”也是一个有用的工具。 - selbie
1
InternetReadFile应该在互联网上的行为与本地Web服务器上的行为相同。某些地方发生了变化;如果不是您的代码,则扩展故障排除。仔细检查来自Web服务器的响应是否符合您的期望,并且中间没有其他硬件或软件导致此行为。请参见此问题,其中提供了一个类似问题的出色示例:https://dev59.com/SlbTa4cB1Zd3GeqP_YaM#5772571 - J.J.
是的,检查响应就是解决方案。响应是http 404错误 - 项目中的其他人将文件移动到了不同的目录=(太愚蠢了! - polotenchiko
@polotenchiko - 请确保回答并接受您自己的问题,以便我们将来可以找到答案。 - codekaizen
2个回答

2

谢谢!看起来如果我没有自己编写一堆代码,我就不会花那么多时间在那里寻找错误了。 同时,下次我被建议使用libcurl - 看起来很好,许可证也没问题。 - polotenchiko
非常感谢您提到 INTERNET_FLAG_KEEP_CONNECTION。 - denis

0

我读取了服务器的响应文本,它是一个“404错误”的响应 - 文件丢失了。所以阅读响应是很有用的 ;)

而且libcurl看起来是WinINet库的不错替代品 - 更容易开始,有很多选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接