2011-07-09 4 views
3

私は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ライブラリを使用してファイル全体をダウンロードするにはどうすればよいですか?

+2

パケットスニッファ(NetMon、wiresarkなど)を実行して、URLを配信しているWebサーバーが実際に期待するバイト数を送信しているかどうかを検出しましたか? – selbie

+0

私は "wireshark"を意味します。 「フィドラー」さえも役に立つだろう。 – selbie

+1

InternetReadFileは、ローカルWebサーバーと同じようにインターネット上で動作する必要があります。何かがどこかに変わった。自分のコードでない場合は、トラブルシューティングを展開してください。ウェブサーバーからの応答を再確認することは、あなたが期待していることであり、途中の他のハードウェアやソフトウェアがその動作を引き起こしていないことです。同様の問題の驚くべき結果の素晴らしい例については、この質問を参照してください:http://stackoverflow.com/questions/5771636/internetopenurl-only-returns-after-entire-http-response-is-downloaded/5772571 –

答えて

0

を見てお勧めします私はテキストとして応答を読んで、それが「404エラー」は、Webサーバからの応答だった - ファイルが欠落していました。したがって、応答を読むことは有益です;)

libcurlはWinINetライブラリの素敵な置き換えのように見えます。

2

InternetOpenURlでINTERNET_FLAG_KEEP_CONNECTIONを設定してみてください。

また、開けた後にハンドルで少なくともHttpQueryInfo(HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER)を実行する必要があります。

私はこれらの事にいくつかの既存のラッパーC++クラス、 http://www.google.com/codesearch#search/&q=INTERNET_FLAG_KEEP_CONNECTION%20lang:c%2B%2B&type=cs

+0

ありがとうございました!自分でコードを書いていないようですが、エラーを探すのにあまり時間を費やしませんでした。 次回はlibcurlを使用するように勧められました。ライセンスはOKです。 – polotenchiko

+0

INTERNET_FLAG_KEEP_CONNECTIONについて言及してくれてありがとう – gdy

関連する問題