FTP 协议 STOR cmd 在 c 中正确接收文件
FTP protocol STOR cmd receiving file correctly in c
我在一个简单的 FTP 服务器上工作(只是为了好玩),最后一步是使用“STOR”cmd 存储文件。
rec_file方法:
int rec_file(char *filename, int sockfd){
int bytes_read;
char buffer[4096];
FILE *f = fopen(filename, "wb");
while (bytes_read=read(sockfd,buffer,sizeof(buffer))){
fwrite(buffer , 1 , sizeof(buffer) , f);
}
fclose(f);
return 0;
}
测试文件a.txt:
TEST123
456
789
TEST!!
已发送文件a.txt:
TEST123
456
789
TEST!! AÛD Ìk P ™sB ÃB p Àa ðÿÿÿÿÿÿ P # €Ìk Ìk @ dB % 0 % Øa P 0 | w n [ Ìk 8Y
ý % 8Y
ý # Àk W.B G
ý 8Y
ý QH /home/felix/ftp ¨A PQ
ý Ãk R
ý `Q
ý =F ) -rA ÿÿÿÿÿÿÿÿ Çk ¨ * 0k 1„A Çk -rA ßJI Çk ¨ 0k 1„A Çk ¨
那我做错了什么?
您的代码写入文件的字节数可能多于您从套接字接收到的字节数。
存储在 bytes_read
中的 read
的 return 值将告诉您实际读取了多少字节。即使数据量很大,read
也不一定总是读满缓冲区,它可能 return 一个较小的数字。您还应该将负值视为错误。
下面的代码有一个非常简单的错误处理。在实际应用程序中,您可能必须对某些 errno
值重试 read
调用,而不是停止读取数据。
while ((bytes_read=read(sockfd,buffer,sizeof(buffer))) > 0){
fwrite(buffer , 1 , bytes_read, f);
}
if(bytes_read < 0) {
perror("read failed");
/* maybe other error handling */
}
我在一个简单的 FTP 服务器上工作(只是为了好玩),最后一步是使用“STOR”cmd 存储文件。
rec_file方法:
int rec_file(char *filename, int sockfd){
int bytes_read;
char buffer[4096];
FILE *f = fopen(filename, "wb");
while (bytes_read=read(sockfd,buffer,sizeof(buffer))){
fwrite(buffer , 1 , sizeof(buffer) , f);
}
fclose(f);
return 0;
}
测试文件a.txt:
TEST123
456
789
TEST!!
已发送文件a.txt:
TEST123
456
789
TEST!! AÛD Ìk P ™sB ÃB p Àa ðÿÿÿÿÿÿ P # €Ìk Ìk @ dB % 0 % Øa P 0 | w n [ Ìk 8Y
ý % 8Y
ý # Àk W.B G
ý 8Y
ý QH /home/felix/ftp ¨A PQ
ý Ãk R
ý `Q
ý =F ) -rA ÿÿÿÿÿÿÿÿ Çk ¨ * 0k 1„A Çk -rA ßJI Çk ¨ 0k 1„A Çk ¨
那我做错了什么?
您的代码写入文件的字节数可能多于您从套接字接收到的字节数。
存储在 bytes_read
中的 read
的 return 值将告诉您实际读取了多少字节。即使数据量很大,read
也不一定总是读满缓冲区,它可能 return 一个较小的数字。您还应该将负值视为错误。
下面的代码有一个非常简单的错误处理。在实际应用程序中,您可能必须对某些 errno
值重试 read
调用,而不是停止读取数据。
while ((bytes_read=read(sockfd,buffer,sizeof(buffer))) > 0){
fwrite(buffer , 1 , bytes_read, f);
}
if(bytes_read < 0) {
perror("read failed");
/* maybe other error handling */
}