InternetReadFile只读取10kb

时间:2011-07-09 06:34:24

标签: c++ windows wininet

我正在尝试使用WinINet库调用从http服务器下载文件。它在我的本地Web服务器上完美运行。但是当我尝试从互联网上下载东西时,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库下载整个文件?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我将响应作为文本阅读,并且是来自Web服务器的“404错误”响应 - 文件丢失了。所以阅读回复很有用;)

libcurl看起来很像WinINet库的替代品 - 更容易入手,有很多选择。