C套接字接收文件
我正在开发非常简单的ftp客户端。我已创建数据连接套接字,但无法成功传输文件: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
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");