V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
salamanderMH
V2EX  ›  程序员

FTP client 发送 CWD 命令,故意让目录不正确,返回 550 错误,但是接下来其他命令也都不对了

  •  
  •   salamanderMH · 2018-06-07 16:28:58 +08:00 · 1777 次点击
    这是一个创建于 2161 天前的主题,其中的信息可能已经有所发展或是发生改变。

    client 是自己用 C 写的

    #define BUFFER_SIZE 1024
    
    char recv_buffer[BUFFER_SIZE];
    char send_buffer[BUFFER_SIZE];
    
    // ...
    else if (start_with(cmd_read, "cd"))
    {
        char *token;
        const char delim[2] = " \t";
        token = strtok(cmd_read, delim);
        char *path = strtok(NULL, delim);
        if (path == NULL)
        {
            printf("please input the path\n");
            continue;
        }
        sprintf(send_buffer, "CWD %s\r\n", path);
        send_cmd(client_socket, send_buffer);
        length = get_respond(client_socket, recv_buffer);
        printf("%s", recv_buffer);   
    }
    


    ftp server 什么要发送两次错误信息?这个如何处理呢?

    Github 源码

    4 条回复    2018-06-08 09:56:21 +08:00
    ryd994
        1
    ryd994  
       2018-06-07 17:32:28 +08:00 via Android
    看起来
    ryd994
        2
    ryd994  
       2018-06-07 17:32:48 +08:00 via Android
    看起来是 550 到 550end 之间都是
    qiyuey
        3
    qiyuey  
       2018-06-07 19:59:47 +08:00
    最近正好写了个 FTP Server,没办法正确处理,确实会终止,因为要不终止是有成本的
    salamanderMH
        4
    salamanderMH  
    OP
       2018-06-08 09:56:21 +08:00
    我在 cd 命令的处理上,补了一点判断
    ```
    // 250 success
    length = get_respond(client_socket, recv_buffer);
    printf("%s", recv_buffer);
    if (!is_correct_respond(recv_buffer, 250))
    {
    // 再接收一次数据,windows FTP server 问题
    get_respond(client_socket, recv_buffer);
    printf("%s", recv_buffer);
    }
    ```
    不是 250 返回的话,再接收一次数据,感觉这样处理有点。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3396 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:41 · PVG 20:41 · LAX 05:41 · JFK 08:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.