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 填充缓冲区,但返回读取的零字节