【问题标题】:FTP protocol STOR cmd receiving file correctly in cFTP协议STOR cmd在c中正确接收文件
【发布时间】:2021-10-27 13:25:20
【问题描述】:

我在一个简单的 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            ¨           

那我做错了什么?

【问题讨论】:

    标签: c file ftp protocols file-transfer


    【解决方案1】:

    您的代码向文件写入的字节数可能比您从套接字接收到的字节数多。

    read 的返回值存储在bytes_read 中,将告诉您实际读取了多少字节。即使数据量很大,read 也可能不会总是读取一个完整的缓冲区,它可能会返回一个较小的数字。您还应该将负值视为错误。

    下面的代码有一个非常简单的错误处理。在实际应用程序中,您可能必须对某些 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  */
        }
    

    【讨论】:

      猜你喜欢
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多