V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
salamanderMH
V2EX  ›  Linux

写了一个 ftp client,但用 socket 接收 LIST 命令的数据不完整

  •  
  •   salamanderMH · 2018-06-06 10:04:59 +08:00 · 1938 次点击
    这是一个创建于 2123 天前的主题,其中的信息可能已经有所发展或是发生改变。

    接收数据在子进程中:

    char data_buffer[BUFFER_SIZE];
    char *ptr = "";
    int data_len = 0;
    int pre_len = 0;
    for (;;)
    {
        bzero(data_buffer, BUFFER_SIZE);
        int length = recv(client_data_socket, data_buffer, BUFFER_SIZE, 0);
        if (length == 0)
        {
            close(client_data_socket);
            break;
        }
        else if (length < 0)
        {
            if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
            {
                continue;
            }
            close(client_data_socket);
            printf("get data failed\n");
            exit(1);
        }
        pre_len = data_len;
        data_len += length;
        char *tmp_ptr = (char *)calloc(data_len, sizeof(char));
        memcpy(tmp_ptr, ptr, pre_len);
        memcpy(tmp_ptr + pre_len, data_buffer, length);
        if (pre_len > 0) free(ptr);
        ptr = tmp_ptr;
    }
    char *tmp_ptr = (char *)calloc(data_len + 1, sizeof(char));
    g2u(ptr, data_len, tmp_ptr, data_len + 1);
    printf("%s\n", tmp_ptr);
    free(ptr);
    free(tmp_ptr);
    exit(0);
    

    g2u 方法是编码转换,把 gbk to utf-8 然后发现读出来的数据少了一部分,我是在 recv 返回 0 的时候,判断数据全部接收,可是发现结果有问题 显然,迅雷下载这几个字,没接收完(不知道哪里出了问题) 真正的文件列表

    3 条回复    2018-06-13 23:38:38 +08:00
    liuxu
        1
    liuxu  
       2018-06-06 10:33:25 +08:00
    g2u 前打个中断看看呗
    salamanderMH
        2
    salamanderMH  
    OP
       2018-06-06 10:57:55 +08:00
    @liuxu
    打印了一下接收到的字节
    ..... 32 32 -47 -72 -64 -41 -49 -62 -44 -40 13 10
    32 是空格,13 是\r 10 是\n
    -47 -72 -64 -41 -49 -62 -44 -40 这一段我用 vc 打印了一下,正好是迅雷下载,看来是 g2u 函数的问题
    tangweihua163
        3
    tangweihua163  
       2018-06-13 23:38:38 +08:00
    我操!终端用宋体。。。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5320 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:04 · PVG 17:04 · LAX 02:04 · JFK 05:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.