我正在尝试制作一个程序来下载一个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);
}
答案 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()
的调用。这是不必要的。)