其实我正在研究非常简单的FTP服务器。 现在我遇到发送文件的问题(FTP协议中的RETR)。我在我的客户端使用套接字和二进制模式。带文本的文件发送完美,但问题是二进制文件(图像等)。
这是我的代码:
FILE *fin=fopen(fileloc,"rb");
if(fin != NULL){
fpos_t filelen;
fseek (fin, 0, SEEK_END);
fgetpos (fin, &filelen);
fseek (fin, 0, SEEK_SET);
printf("Sending file %s (%d b)", fileloc, filelen);
sprintf(sbuffer,"150 Opening BINARY mode data connection for file transfer.\r\n");
bytes = send(ns, sbuffer, strlen(sbuffer), 0);
byte temp_buffer[512];
long int totalsent;
totalsent = 0;
while (!feof(fin)){
memset(temp_buffer, '\0', sizeof(sbuffer));
fgets((char *)temp_buffer, sizeof(sbuffer), fin);
if (!active) bytes = send(ns_data, (char *)temp_buffer, strlen(sbuffer), 0);
else bytes = send(s_data_act, (char *)temp_buffer, strlen(sbuffer), 0);
totalsent = totalsent + bytes;
printf(" file size = %d, send = %d bytes, strlen = %d, total = %d, left = %d\n",
filelen, bytes, strlen(sbuffer), totalsent, filelen-totalsent);
}
fclose(fin);
sprintf(sbuffer,"250 File transfer completed... \r\n");
bytes = send(ns, sbuffer, strlen(sbuffer), 0);
}
我的FTP客户端正在获取内部存在差异的不完整文件(我打开带有记事本的文件进行比较),正如您在此屏幕图像上看到的那样,如果URL无需登录即可显示:
http://i53.tinypic.com/2wcjtdk.jpg
文件大小也有差异 - 原始文件大约为7kB,发送副本大约少1kB。我使用了很多不同的FTP客户端,也存在同样的问题。
答案 0 :(得分:5)
在您的发送调用中,您使用的是strlen,它可能适用于文本数据但不适用于二进制数据。当你从文件中读取时,你需要使用像read之类的调用来告诉你实际读取了多少字节,这样你就可以在发送调用中发送那么多字节。