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  */
    }