C套接字下载.exe大6倍?

时间:2013-11-14 05:21:17

标签: c windows sockets

我正在尝试制作一个程序来下载一个exe并使用winsock2.h在本地保存它可行,就像它下载文件并保存它一样。但是结束文件几乎是它下载的实际文件的6倍。我似乎无法弄清楚为什么。我试图在本地下载并保存的文件是ccleaner403.exe,例如它大约是4mb,但最终结果是36 mb。显然还有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);
}

2 个答案:

答案 0 :(得分:2)

recv()的返回值告诉您每次实际读取的字节数。你忽略了这一点,并轻率地假设缓冲区被填满了。很可能不是。

你需要:

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

你真的不需要memset()

答案 1 :(得分:1)

每次循环时,您总是在文件中写sizeof(buf)个字节,这很可能大于tmpres中收到的实际字节数。

sizeof(buf)的通话中将tmpres更改为fwrite()。 (然后删除对memset()的调用。这是不必要的。)