InternetReadFile читает только 10kb - PullRequest
3 голосов
/ 09 июля 2011

Я пытаюсь загрузить файл с http-сервера, используя вызовы библиотеки WinINet. Он отлично работает на моем локальном веб-сервере. но когда я пытаюсь загрузить что-то из Интернета, InternetReadFile читает только ~ 10 КБ любого файла (текстового или двоичного). TRANSFER_SIZE = 4096 в примере ниже, таким образом, есть два чтения на 4 КБ и одно на 2 КБ. Каждый следующий 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 ]

2 голосов
/ 15 июля 2011

Попробуйте установить INTERNET_FLAG_KEEP_CONNECTION в InternetOpenURl.

Вы должны также сделать хотя бы 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

0 голосов
/ 19 июля 2011

Я прочитал ответ как текст, и это был ответ «404 ошибка» с веб-сервера - файл отсутствовал. Так что полезно читать ответы;)

И libcurl выглядит как хорошая замена библиотеки WinINet - проще начать, много опций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...