WinHTTP Async Callback - PullRequest
       10

WinHTTP Async Callback

0 голосов
/ 20 февраля 2012

Я не очень хорош в C ++, если вы видите что-то во фрагменте кода, что может быть лучше, пожалуйста, просветите меня!

Я реализую winhttp в асинхронном режиме. Но у меня проблемы с получением ответа. Я не могу понять это. Потому что вы должны иметь возможность анализировать весь ответ сразу. Так как может возникнуть несколько параллельных запросов, буферизация ответа (заголовки + тело) в глобальной переменной не подходит.

Как я могу получить ответ на запрос http get? Или же, является ли хорошей практикой синхронное выполнение winhttp в новом потоке (поэтому основной цикл не блокируется, а затем вызывает функцию по завершении?):

     void __stdcall cb(HINTERNET h, DWORD_PTR d, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength){ 
         char* s=new char[1];

             DWORD dwSize = 0;
             if (dwInternetStatus==WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE){
                                 MessageBoxA(0,s,"",0);

                WinHttpQueryDataAvailable( h, &dwSize);
                .....

             }

 }

И звонок в основном:

...winhttpopen...
WinHttpSetStatusCallback(request, (WINHTTP_STATUS_CALLBACK)whCallback,WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS,0);
...winhttpsend....

1 Ответ

4 голосов
/ 16 марта 2012

Проверьте этот пример кода на MSDN - Асинхронное завершение в WinHTTP .

При вызове WinHttpQueryDataAvailable в QueryData создается состояние обратный вызов с WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE завершением в параметр dwInternetStatus. Проверяя значение, указанное Параметр lpvStatusInformation, обратный вызов может определить, как осталось много данных для чтения, и если нет оставшихся данных, можно перейти к отображению всех данных, которые были прочитаны.

Это показывает, что ваш обратный вызов вызывается с указателем буфера и длиной данных в нем.

...