0

ファイルをダウンロードして保存するように、winsock2.hを使用してexeをダウンロードしてローカルに保存する小さなプログラムを作成しようとしています。ただし、最終ファイルは、実際にダウンロードするファイルの約 6 倍の大きさになります。理由が分からないようです。ダウンロードしてローカルに保存しようとしているファイルは ccleaner403.exe です。たとえば、約 4 MB ですが、最終結果は 36 MB です。明らかにそこにはまだ HTTP ヘッダーがありますが、それらは 32 MB ではありません。ファイルが少し長いので、「ファイル書き込み部分」を切り取っただけです。残りが必要な場合は、お尋ねください。

#define BUFSIZE 4096

// Receive the data
memset(buf, 0, sizeof(buf));

// Open file for writing
fp = fopen("stuff.exe", "wb");

header = 0;
test = 0;

while ((tmpres = recv(sock, buf, BUFSIZ, 0)) > 0)
{

    fwrite(buf, 1, sizeof(buf), fp);
    memset(buf, 0, tmpres);
}
4

2 に答える 2

2

からの戻り値は、recv()毎回実際に読み取られたバイト数を示します。あなたはそれを無視し、バッファがいっぱいになったと思い込みます。おそらくそうではありませんでした。

必要なもの:

while ((tmpres = recv(sock, buf, BUFSIZ, 0)) > 0)
{
    if (fwrite(buf, 1, tempres, fp) != tempres)
        ...oops...failed to write...
}

は本当に必要ありませんmemset()

于 2013-11-14T05:26:05.637 に答える
1

ループのたびに、常にsizeof(buf)バイトをファイルに書き込んでいます。これは、 で受信した実際のバイト数よりも大きい可能性がありますtmpres

sizeof(buf)tmpresの呼び出しで に変更しfwrite()ます。(その後、 への呼び出しを削除しますmemset()。不要です。)

于 2013-11-14T05:25:56.183 に答える