C++ InternetReadFile仅读取10kb

C++ InternetReadFile仅读取10kb,c++,windows,wininet,C++,Windows,Wininet,我正在尝试使用WinINet库调用从http服务器下载文件。它在我的本地web服务器上运行得非常好。但是,当我试图从internet下载某些内容时,InternetReadFile只能读取任何文件(文本或二进制文件)的10kb。在下面的示例中,TRANSFER_SIZE=4096,因此有两个4kb的读取和一个2kb的读取。每下一个InternetReadFile返回true,读取0字节 hInternet = InternetOpen(L"Agent", INTERNET_OPEN_TY

我正在尝试使用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 library下载整个文件?

尝试在InternetOpenURl上设置INTERNET\u标志\u保持\u连接

打开后,您还应该在句柄上至少执行HttpQueryInfo(HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER)

<>我建议在这些东西中查看一些现有的包装器C++类,

我将响应读取为文本,这是来自web服务器的“404错误”响应-文件丢失。因此,阅读回答很有用;)


libcurl看起来是WinINet库的很好的替代品-更容易开始,有很多选项

您是否运行了数据包嗅探器(NetMon、wiresark等)来检测发送URL的web服务器是否实际发送了您期望的字节?我是说“wireshark”。甚至“fiddler”也会很有用。InternetReadFile在Internet上的行为应该与在本地Web服务器上的行为相同。某处发生了变化;如果不是您的代码,请展开故障排除。仔细检查Web服务器的响应是你所期望的,中间没有其他硬件或软件会导致行为。查看这个问题,可以找到一个类似问题的好例子,结果令人惊讶:是的,检查响应就是解决方案。响应是http 404错误-项目中的另一个人将文件移动到了不同的目录=(这太愚蠢了!@polotenchiko-确保回答(并接受)您自己的问题,以便我们将来可以找到答案。谢谢!看起来如果我没有自己编写一堆代码,我就不会花那么多时间在那里查找错误。还有人建议我下次使用libcurl-看起来很好,许可证也可以。非常感谢您提到INTERNET\u FLAG\u KEEP\u CONNECTION