我正在使用WinINET编写一个下载文件实用程序,并注意到(特别是在大型下载时),WinINET InternetOpenUrl()调用仅在下载完整个HTTP响应后才返回.
我通过使用Charles代理工具以及使用WireShark来确认这一点,并注意到下载完全完成,然后WinINET通知我的代码.
一些简化(同步)代码:
hInt = InternetOpen(USER_AGENT_NAME, INTERNET_OPEN_TYPE_PRECONFIG,
NULL, NULL, 0);
DWORD dwRequestFlags = INTERNET_FLAG_NO_UI // no UI please
|INTERNET_FLAG_NO_AUTH // don't authenticate
|INTERNET_FLAG_PRAGMA_NOCACHE // do not try the cache or proxy
|INTERNET_FLAG_NO_CACHE_WRITE; // don't add this to the IE cache
hUrl = InternetOpenUrl(hInt, szURL, NULL, 0, dwRequestFlags, NULL);
if (hUrl)
{
// <only gets here after entire download is complete>
InternetCloseHandle(hUrl);
}
InternetCloseHandle(hInt);
Run Code Online (Sandbox Code Playgroud)
文档建议这发送请求,并处理响应的标头(未完成下载),然后您应该运行InternetReadFile()循环直到它返回TRUE并且dwNumberOfBytesRead为0.
来自MSDN
InternetOpenUrl功能: InternetOpenUrl函数解析URL字符串,建立与服务器的连接,并准备下载URL标识的数据.然后,应用程序可以使用InternetReadFile …