C套接字接收文件

C套接字接收文件,c,file,sockets,ftp,transfer,C,File,Sockets,Ftp,Transfer,我正在开发非常简单的ftp客户端。我已创建数据连接套接字,但无法成功传输文件: FILE *f = fopen("got.png", "w"); int total = 0; while (1){ memset(temp, 0, BUFFSIZE); int got = recv(data, temp, sizeof(temp), 0); fwrite(temp, 1, BUFFSIZE, f); total += got; if (tot

我正在开发非常简单的ftp客户端。我已创建数据连接套接字,但无法成功传输文件:

FILE *f = fopen("got.png", "w");
int total = 0;
while (1){      
    memset(temp, 0, BUFFSIZE);
    int got = recv(data, temp, sizeof(temp), 0);

    fwrite(temp, 1, BUFFSIZE, f);
    total += got;

    if (total == 1568){
    break;
    }
}
fclose(f);
BUFFSIZE=1568

我知道我的文件大小是1568字节,所以我尝试下载它只是为了测试。当我尝试下载.xml或.html文件时,所有内容都是文件,但当我尝试下载png或avi文件时,没有任何效果。简单地说,原始文件大小是1568,但get.png文件大小是1573。我不知道是什么原因造成的

编辑:

我已经修改了代码,所以现在看起来像(它可以接受任何文件大小):


仍然收到的文件太长了2个字节。

即使只收到了部分缓冲区,也始终在写入整个缓冲区。这与所有TCP问题中约50%的问题相同

memset不是必需的。我希望temp是一个数组,这样
sizeof(temp)
的计算结果就不会达到本机指针大小。最好也在那里使用
BUFFSIZE



看到您的编辑,在解决第一个问题后,还有另一个问题:以二进制模式打开文件。

您以文本模式打开文件,因此在写入文件时,裸露的CR/LF字符将被转换为CRLF对。您需要改为以二进制模式打开文件:

FILE *f = fopen("got.png", "wb");

听起来像是文本/二进制I/O问题。你是不是碰巧在Windows上运行这个?在这种情况下,试着打开二进制(而不是文本)I/O文件,并确保读卡器也这样做。太棒了!我知道这很简单,但你肯定救了我。感谢在这种情况下这似乎不是问题,因为OP收到的消息比预期的要大。对我来说非常有意义。他写的缓冲区比预期的要大。事实上,我们现在知道了他的网络的MTU:)
FILE *f = fopen("got.png", "wb");