0

我正在尝试制作一个小程序来下载exe并使用winsock2.h将其保存在本地,它可以正常工作,就像它下载文件并保存它一样。但最终文件几乎是它下载的实际文件的 6 倍。我似乎无法弄清楚为什么。我尝试下载并保存在本地的文件是 ccleaner403.exe,例如它大约 4mb,但最终结果是 36mb。显然那里仍然有 HTTP 标头,但那些不是 32mb 的。该文件有点长,所以我只是剪掉了“文件写入部分”。如果您需要其余的,请询问。

#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

from 的返回值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)为。(然后删除对 . 的调用。这是不必要的。)tmpresfwrite()memset()

于 2013-11-14T05:25:56.183 回答