C Socket下载.exe要大6倍?

C Socket下载.exe要大6倍?,c,windows,sockets,C,Windows,Sockets,我正在尝试制作一个小程序来下载一个exe,并使用winsock2.h在本地保存它。它可以工作,就像它下载文件并保存一样。但最终文件几乎是它下载的实际文件的6倍大。我似乎不明白为什么。我试图下载并在本地保存的文件是ccleaner403.exe,例如大约4mb,但最终结果是36MB。显然,其中仍然有HTTP头,但这些不是32mb的。这个文件有点长,所以我删掉了“文件编写部分”。如果你需要其他的,就问吧 #define BUFSIZE 4096 // Receive the data memset

我正在尝试制作一个小程序来下载一个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);
}

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


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

每次循环中,您总是将
sizeof(buf)
字节写入文件,这很可能大于
tmpres
中接收的实际字节数


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

每次循环中,您总是将
sizeof(buf)
字节写入文件,这很可能大于
tmpres
中接收的实际字节数


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

每次循环中,您总是将
sizeof(buf)
字节写入文件,这很可能大于
tmpres
中接收的实际字节数


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

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

你需要:

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

您真的不需要
memset()

来自
recv()
的返回值告诉您每次实际读取了多少字节。您忽略了这一点,并愉快地假设缓冲区已满。很可能不是

你需要:

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

您真的不需要
memset()

来自
recv()
的返回值告诉您每次实际读取了多少字节。您忽略了这一点,并愉快地假设缓冲区已满。很可能不是

你需要:

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

您真的不需要
memset()

来自
recv()
的返回值告诉您每次实际读取了多少字节。您忽略了这一点,并愉快地假设缓冲区已满。很可能不是

你需要:

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

你真的不需要
memset()

我讨厌别人背着我看书然后打字比我快我还在玩这个奇怪的东西,有两个
memset
什么都不做。。。不知道他们为什么在那里。我可能是出于好意,但就是没有完成。@Steven如果你使用memset,你的记忆就会清晰,然后你就可以通过使用strlen而不是sizeof来计算你收到了多少。但是,这将不允许接收到的数据包含NULL(必须允许,因为它是二进制数据)。所以这是一种错误的方法,你应该听Daskwuff的,但是这是使用memset的一种情况……我讨厌人们在我身后阅读然后打字比我快我还在玩这个奇怪的东西,有两个
memset
什么都不做。。。不知道他们为什么在那里。我可能是出于好意,但就是没有完成。@Steven如果你使用memset,你的记忆就会清晰,然后你就可以通过使用strlen而不是sizeof来计算你收到了多少。但是,这将不允许接收到的数据包含NULL(必须允许,因为它是二进制数据)。所以这是一种错误的方法,你应该听Daskwuff的,但是这是使用memset的一种情况……我讨厌人们在我身后阅读然后打字比我快我还在玩这个奇怪的东西,有两个
memset
什么都不做。。。不知道他们为什么在那里。我可能是出于好意,但就是没有完成。@Steven如果你使用memset,你的记忆就会清晰,然后你就可以通过使用strlen而不是sizeof来计算你收到了多少。但是,这将不允许接收到的数据包含NULL(必须允许,因为它是二进制数据)。所以这是一种错误的方法,你应该听Daskwuff的,但是这是使用memset的一种情况……我讨厌人们在我身后阅读然后打字比我快我还在玩这个奇怪的东西,有两个
memset
什么都不做。。。不知道他们为什么在那里。我可能是出于好意,但就是没有完成。@Steven如果你使用memset,你的记忆就会清晰,然后你就可以通过使用strlen而不是sizeof来计算你收到了多少。但是,这将不允许接收到的数据包含NULL(必须允许,因为它是二进制数据)。所以这是错误的方法,你应该听Dashwuff的,然而这是使用memset的一个例子。。。