InternetReadFile - проблема чтения длиного файла
От: jacque  
Дата: 18.10.05 14:39
Оценка:
Доброго времени суток.
Приложение посылает xml-запросы серверу и получает их в таком же виде.
Имею возможность видеть лог сервиса на сервере, ко мне уходит "большой"(24к) ответ, InternetReadFile читает маленький кусочек и все, а когда я закрываю handle запроса вываливаеться исключение win32.
Код
        if (!HttpSendRequest(hRequest, NULL, 0, (LPVOID)postData, postDataSize)) //шлю хмл
        {
            ret = EHTTPERROR_CreateHTTPRequestFailed;
            break;
        }

        if (!HttpEndRequest(hRequest, NULL, 0, 0))
        {
            DWORD d = GetLastError();

            ret = EHTTPERROR_CreateHTTPRequestFailed;
            break;
        }
        // read answer
        char buff[ 1024 ];
        int recived = 0;
        while (1)
        {
            DWORD nread = 0;
            if (!InternetReadFile(hRequest, buff, 1024, &nread)) //читает все время 1736 байт от длиного ответа
            {
                ret = EHTTPERROR_CreateHTTPRequestFailed;
                break;
            }
            if (nread)
            {
                int oldSize = recived;
                recived += nread;
                memcpy(recvData + oldSize, buff, nread);
            }
            else
                break;
        }

        recvData[ recived ] = 0;

        break;
    }

    if (hRequest)
        InternetCloseHandle(hRequest); //исключение, так как не все дочитал


Если кто сталкивался с таким, прошу помочь.
Заранее спасибо
Re: InternetReadFile - проблема чтения длиного файла
От: Alex Fedotov США  
Дата: 18.10.05 18:57
Оценка:
Здравствуйте, jacque, Вы писали:

J>Доброго времени суток.

J>Приложение посылает xml-запросы серверу и получает их в таком же виде.
J>Имею возможность видеть лог сервиса на сервере, ко мне уходит "большой"(24к) ответ, InternetReadFile читает маленький кусочек и все, а когда я закрываю handle запроса вываливаеться исключение win32.
J>Код
J> if (!HttpSendRequest(hRequest, NULL, 0, (LPVOID)postData, postDataSize)) //шлю хмл
J> {
J> ret = EHTTPERROR_CreateHTTPRequestFailed;
J> break;
J> }

J> if (!HttpEndRequest(hRequest, NULL, 0, 0))

J> {
J> DWORD d = GetLastError();

J> ret = EHTTPERROR_CreateHTTPRequestFailed;

J> break;
J> }
J> // read answer
J> char buff[ 1024 ];
J> int recived = 0;
J> while (1)
J> {
J> DWORD nread = 0;
J> if (!InternetReadFile(hRequest, buff, 1024, &nread)) //читает все время 1736 байт от длиного ответа
J> {
J> ret = EHTTPERROR_CreateHTTPRequestFailed;
J> break;
J> }
J> if (nread)
J> {
J> int oldSize = recived;
J> recived += nread;
J> memcpy(recvData + oldSize, buff, nread);
J> }
J> else
J> break;
J> }

J> recvData[ recived ] = 0;


J> break;

J> }

J> if (hRequest)

J> InternetCloseHandle(hRequest); //исключение, так как не все дочитал


1. По какому условию заканчивается цикл? Если InternetReadFile возвращает FALSE, то какой код ошибки выдает GetLastError?
2. Вы уверены, что в recvData достаточно места, чтобы получить все данные?
3. InternetCloseHandle не будет бросать исключение если не все данные прочитаны. Скорее, вы где-то память портите.

P.S. не recived, a received.
-- Alex Fedotov
Re[2]: InternetReadFile - проблема чтения длиного файла
От: jacque  
Дата: 19.10.05 08:31
Оценка:
Здравствуйте, Alex Fedotov.
AF>1. По какому условию заканчивается цикл? Если InternetReadFile возвращает FALSE, то какой код ошибки выдает GetLastError?
FALSE не возвращаеться, цикл заканчиваеться когда nread = 0;
AF>2. Вы уверены, что в recvData достаточно места, чтобы получить все данные?
Да.
AF>3. InternetCloseHandle не будет бросать исключение если не все данные прочитаны. Скорее, вы где-то память портите.
Ничего не могу ответить. Вроде все коректно. Могу выслать весь мой код.
AF>P.S. не recived, a received.
Спасибо — будет исправлено, в следующей версии.

Почему-то закрадываеться мысль, что виноват squid.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.