WinInet API を非同期的に使用して HTTP 要求を実行するコードがあります。一般的に、私のコードは機能しますが、物事を行う「正しい」方法について混乱しています。InternetReadFile()のドキュメントには、次のように記載されています。
すべてのデータを確実に取得するには、関数が TRUE を返し、lpdwNumberOfBytesRead パラメーターがゼロになるまで、アプリケーションで InternetReadFile 関数を呼び出し続ける必要があります。
しかし、非同期モードでは、false を返す (または返さない) 場合があり、ERROR_IO_PENDING
非同期で作業を行い、終了時にコールバックを呼び出すことを示す のエラーが返されます。ドキュメントを文字通り読むと、非同期呼び出しは要求されたバッファの部分的な読み取りを行うだけで、呼び出し元は 0 バイトの読み取りが発生するまで InternetReadFile を呼び出し続ける必要があるようです。
同期的に使用する典型的な実装InternetReadFile()
は次のようになります。
while(InternetReadFile(Request, Buffer, BufferSize, &BytesRead) && BytesRead != 0)
{
// do something with Buffer
}
しかし、 への 1 つの呼び出しがInternetReadFile()
、非同期で作業を行うことを通知する可能性があるため (そして、要求のすべてではなく一部を読み取る可能性があります)、はるかに複雑になります。ガイダンスとしてMSDN のサンプル コードに目を向けると、実装は単純で、1 回呼び出すInternetReadFile()
だけで、要求されたバッファー全体を即座にまたは非同期で読み取って 1 回のリターンを期待するだけです。これはこの関数を使用する正しい方法ですか、それとも MSDN サンプル コードInternetReadFile()
は、要求されたバッファーの一部のみを読み取る可能性を無視していますか?