c++ - InternetReadFile 只读取 10kb

标签 c++ windows wininet

我正在尝试使用 WinINet 库调用从 http 服务器下载文件。它在我的本地网络服务器上工作得很好。但是当我试图从互联网上下载一些东西时,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 库下载整个文件?

最佳答案

尝试在 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

关于c++ - InternetReadFile 只读取 10kb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6633188/

相关文章:

c++ - 使用过多的功能

c++ - 如何转发声明第三方结构

c++ - 使用 GCC 编译 .CPP

java - 通过 Java 弄清楚 Windows 中的系统文件是什么

mfc - Web 浏览器控件中的文档模式菜单功能

c++ - 存在 `equiv` 以通过 `comp` 满足比较要求

c - LOGON32_LOGON_INTERACTIVE 是否提供受限 token ?

c# - 支持混合空格和制表符的编辑器?

vba - InternetOpenUrl 在第三次及后续调用时挂起并失败

wininet - 从 URL 读取文件到字符串缓冲区的简单函数(使用 WinInet.dll 的 C++/MQL{4|5})