2012-02-20 456 views
0

我不是很擅長C++,如果你看到代碼片段中可能更好的東西,請教育我!WinHTTP異步回調

我以異步方式實現winhttp。但我很難檢索響應。我無法弄清楚。因爲你應該能夠一次解析整個響應。由於可能發生多個concurent請求,因此緩衝全局變量中的響應(標頭+主體)不是一種好的方法。

如何檢索http獲取請求的響應?否則,它是一個很好的做法,在一個新的線程中執行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

在QueryData到WinHttpQueryDataAvailable調用生成狀態 回調有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 2012-07-23 10:14:27

+0

WinHTTP **文檔中的**異步完成如何給出一個例子 - 除了異步回調以外,很有趣。 – 2017-02-21 16:10:31