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

2018-06-06 10:04:59 +08:00
 salamanderMH

接收数据在子进程中:

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 的时候,判断数据全部接收,可是发现结果有问题 显然,迅雷下载这几个字,没接收完(不知道哪里出了问题) 真正的文件列表

1948 次点击
所在节点    Linux
3 条回复
liuxu
2018-06-06 10:33:25 +08:00
g2u 前打个中断看看呗
salamanderMH
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
2018-06-13 23:38:38 +08:00
我操!终端用宋体。。。。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/460769

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX