私はWinINetライブラリ呼び出しを使用してhttpサーバーからファイルをダウンロードしようとしています。それは私のローカルWebサーバー上で完璧に動作します。しかし、インターネットから何かをダウンロードしようとすると、InternetReadFileは任意のファイル(テキストまたはバイナリ)の〜10kbのみを読み込みます。 TRANSFER_SIZE = 4096であり、したがって、4kbで2回、2kbで1回です。次のすべてのInternetReadFileはtrueを返し、0バイトが読み込まれます。InternetReadFileは10kbのみを読み取る
hInternet = InternetOpen(L"Agent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
DWORD options = INTERNET_FLAG_NEED_FILE|INTERNET_FLAG_HYPERLINK|INTERNET_FLAG_RESYNCHRONIZE|INTERNET_FLAG_RELOAD;
HINTERNET hSession = InternetOpenUrl(hInternet, URL, NULL, NULL, options, 0);
hFile = CreateFile(...);
...
do {
DWORD dwWriteSize, dwNumWritten;
BOOL bRead = InternetReadFile(hSession, pBuf, TRANSFER_SIZE, &dwReadSizeOut);
dwWriteSize = dwReadSizeOut;
if (bRead && dwReadSizeOut > 0) {
dwTotalReadSize += dwReadSizeOut;
WriteFile(hFile, pBuf, dwWriteSize, &dwNumWritten, NULL);
// File write error
if (dwWriteSize != dwNumWritten) {
CloseHandle(hFile);
return false;
}
}
else {
if (!bRead)
{
// Error
CloseHandle(hFile);
return false;
}
break;
}
} while(1);
WinINetライブラリを使用してファイル全体をダウンロードするにはどうすればよいですか?
パケットスニッファ(NetMon、wiresarkなど)を実行して、URLを配信しているWebサーバーが実際に期待するバイト数を送信しているかどうかを検出しましたか? – selbie
私は "wireshark"を意味します。 「フィドラー」さえも役に立つだろう。 – selbie
InternetReadFileは、ローカルWebサーバーと同じようにインターネット上で動作する必要があります。何かがどこかに変わった。自分のコードでない場合は、トラブルシューティングを展開してください。ウェブサーバーからの応答を再確認することは、あなたが期待していることであり、途中の他のハードウェアやソフトウェアがその動作を引き起こしていないことです。同様の問題の驚くべき結果の素晴らしい例については、この質問を参照してください:http://stackoverflow.com/questions/5771636/internetopenurl-only-returns-after-entire-http-response-is-downloaded/5772571 –