2012-02-20 2 views
0

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

Я реализую 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.... 

ответ

4

Проверьте этот образец кода на MSDN - Asynchronous Completion in WinHTTP.

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

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

+0

Если у вас есть опыт работы с winhttp и вы можете дать руку :-) http://stackoverflow.com/questions/11577503/winhttp-used-in-async-mode-error-internet-cannot-connect-how-to -cleanly-close – Ghita

+0

Забавно, как документация ** Asynchronous Completion в WinHTTP ** дает пример всего - кроме асинхронного обратного вызова. –