Почему WinHttpQueryDataAvailable сообщает, что доступно 0 байт? - PullRequest
2 голосов
/ 21 ноября 2011

Синхронный режим.GetLastError = 0, WinHttpQueryDataAvailable само возвращает ИСТИНА (т.е. ОК), но количество байтов для чтения = 0

Есть идеи, что это значит?Обычно он работает нормально (чтение потока JPEG с камеры), но иногда застревает здесь (что приводит к повторному подключению кода).

Согласно MSDN, WinHttpQueryDataAvailable не должен был возвращаться: «Если сеанс синхронный, запрос ожидает, пока данные не станут доступными».

Извлечение кода здесь:

g_HSession = WinHttpOpen( L"Jet", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0 );

ResultsOk = WinHttpSendRequest( 
    hRequest,
    WINHTTP_NO_ADDITIONAL_HEADERS,
    0, WINHTTP_NO_REQUEST_DATA, 0, 
    0, 0);

// End the request.
if (ResultsOk)
{
    ResultsOk = WinHttpReceiveResponse( hRequest, NULL );

    DWORD BytesToRead = 0;

    if (WinHttpQueryDataAvailable( hRequest, &BytesToRead ))
    {
        if (BytesToRead) // THIS IS SOMETIMES 0 - seems wrong to me
        {
            if (WinHttpReadData( hRequest, pReadPos, min(BytesToRead, (unsigned)SizeRemaining), &NumRead ))
            {
                ...etc!

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Основной ответ HTTP был успешно получен, но он был пустым (то есть ответ нулевой длины) или все данные были прочитаны и закрыты. WinHttpQueryDataAvailable указывает на это, возвращая TRUE, в котором по-прежнему отображается нулевое число доступных данных.

Подумайте о:

HTTP/1.0 200 OK
Content-Length: 0
1 голос
/ 21 ноября 2011

Я предполагаю, что ваша BytesToRead переменная без знака, как и должно быть?

Вы можете попробовать реструктурировать свой код, чтобы он выглядел больше как пример прямо под заголовком "Примеры" на эта страница .

Помогает ли это решение вообще?

Не имеет отношения к вопросу, но если вы используете Visual Studio, вы можете перейти в свойнастройки проекта (что-то вроде «Свойства проекта»> «Настройки проекта по умолчанию»> «Набор символов»), и тогда вам не нужно ставить букву L перед строками, как в g_HSession = WinHttpOpen( L"Jet"....

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