我正在开发非常简单的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但got.png文件大小是1573.我无法弄清楚可能导致这种情况的原因。
编辑:
我修改了我的代码,现在它看起来像(它可以接受任何文件大小):
FILE *f = fopen("got.png", "w");
while (1){
char* temp = (char*)malloc(BUFFSIZE);
int got = recv(data, temp, BUFFSIZE, 0);
fwrite(temp, 1, got, f);
if (got == 0){
break;
}
}
fclose(f);
仍然收到的文件太长了2个字节。
答案 0 :(得分:0)
即使您只收到部分缓冲区,也总是在写一个完整的缓冲区。所有TCP问题中约有50%是同样的问题。
没有必要使用memset。我希望temp是一个数组,以便sizeof(temp)
不会计算到本机指针大小。在那里更好地使用BUFFSIZE
。
看到你的编辑,在修复第一个问题之后还有另一个问题:以二进制模式打开文件。
答案 1 :(得分:0)
您正在以文本模式打开文件,因此在写入文件时,裸CR / LF字符将转换为CRLF对。您需要以二进制模式打开文件:
FILE *f = fopen("got.png", "wb");