【发布时间】: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 服务器上的行为相同。某处发生了一些变化;如果不是您的代码,请扩展您的故障排除。仔细检查来自网络服务器的响应是否符合您的预期,并且中间没有其他硬件或软件导致该行为。请参阅此问题以获取类似问题的一个很好的示例,结果令人惊讶:stackoverflow.com/questions/5771636/…
-
是的,检查响应是解决方案。响应是 http 404 错误 - 项目中的其他人将文件移动到不同的目录 =(这太愚蠢了!
-
@polotenchiko - 确保回答(并接受)您自己的问题,以便我们将来找到答案。