0

私はC++があまり得意ではありません。コードフラグメントにもっと良いものがあれば、教えてください。

私はwinhttpを非同期的に実装しています。しかし、応答を取得するのに問題があります。私はそれを理解することはできません。応答全体を一度に解析できるはずだからです。複数の同時要求が発生する可能性があるため、応答(headers + body)をグローバル変数にバッファリングすることはできません。

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

1 に答える 1

4

このサンプルコードは、MSDN- WinHTTPでの非同期完了で確認してください。

QueryDataでWinHttpQueryDataAvailableを呼び出すと、dwInternetStatusパラメーターが完了したステータスコールバックが生成されWINHTTP_CALLBACK_STATUS_DATA_AVAILABLEます。lpvStatusInformationパラメーターが指す値をチェックすることにより、コールバックは読み取られるデータの量を判別でき、残りのデータがない場合は、読み取られたすべてのデータの表示に進むことができます。

これは、コールバックがバッファポインタとその中のデータの長さで呼び出されていることを示しています。

于 2012-03-16T18:30:44.763 に答える