アプリ版:「スタンプのみでお礼する」機能のリリースについて

下のようなプログラムは、httpサーバから特定のファイルを
ダウンロードすることが目的です。
(※referer, file名は仮のものです。)

試しに動かしてみて、転送速度が比較的速い場合には、一応問題なく
ダウンロードすることができたのですが、転送速度が遅い場合には、
ファイルサイズがどんどん膨れ上がってしまいます。

問題は、InternetReadFileでブロックされることがないからだと
推測しましたが、情報が少なく困っています。
転送速度が遅い場合にも正常にダウンロードするにはどうしたら
よいでしょうか?


#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <stdlib.h>

bool GetHttpFile(){

  HINTERNET hInternet;
  HINTERNET hFile;
  char Buf[1000]; /* バッファ */
  DWORD ReadSize;
  BOOL bResult;
  wchar_t szHead[] = TEXT("Referer:http://aaa.com/\r\n\r\n"); // ヘッダにRefererを追加する
  FILE *fp;
  bool ret;

  /* 保存先ファイル作成/open */  
  fp = fopen("sample.zip", "wb");
  if (fp == NULL){  /* ファイル作成/openに失敗 */
    ret = false;
    
  }else{ /* ファイル作成/openに成功 */
    /* WININET初期化 */
    hInternet = InternetOpen(
      TEXT("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"),
      INTERNET_OPEN_TYPE_PRECONFIG,
      NULL,
      NULL,
      0);
  
    /* URLのオープン */
    hFile = InternetOpenUrl(
      hInternet,
      TEXT("http://aaa.com/bbb.zip"),
      szHead,
      0,
      INTERNET_FLAG_RELOAD,
      0);
  
    /* オープンしたURLからデータを(1000バイトずつ)読み込む */
    for(;;){
      ReadSize = 1000;
  
      bResult = InternetReadFile(
        hFile,
        Buf,
        1000,
        &ReadSize);
  
      /* 全て読み込んだらループを抜ける */
      if(bResult && (ReadSize == 0)) break;
      
      /* ファイルに書き込み */
      fwrite(Buf, sizeof(char), 1000, fp);
    }
  
    /* 後処理 */
    InternetCloseHandle(hFile);
    InternetCloseHandle(hInternet);
    fclose(fp);
    ret = true;
  }
  
  return ret;
}

int main(){
  if(GetHttpFile() == true){
    printf("成功\n");
  }else{
    printf("失敗\n");
  }
  
  return 0;

}

A 回答 (2件)

あくまで予想なので間違ってるかも



ダウンロードの関数とか使ったことないし、処理もちらっとしか見てないけど、
1000バイトずつ)読み込むってので、1000バイト読めなかった場合の差分が増えているってことはない?
例えば500しか読めなかったら、残りの500が不定データとして格納されてその分最終的なDLサイズが増えているとか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

まさにその通りだと思われます。
fwriteの引数設定がよくないようでした。

お礼日時:2008/03/30 21:58

私の環境で 30MB のファイルでテストしましたがサイズが膨らむ現象は再現しないので


わからないのですが、気になるところがありましたので……。

>for(;;){
>ReadSize = 1000;

ReadSize = 0;

>/* ファイルに書き込み */
>fwrite(Buf, sizeof(char), 1000, fp);

fwrite(Buf, sizeof(char), ReadSize, fp);

としないと、TCP/IP のタイムアウトが原因でサイズが膨らむことはないのでしょうか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
おそらくご指摘の通りだと思われます。

InternetReadFileの最後の引数には、ダウンロードした
byte数が入るようで、ご指摘の通りに修正してみました。

現在は帯域が大きく直ったか確かめられません。
正常にダウンロードできたことは確認しました。

お礼日時:2008/03/30 21:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!