2016-05-12 30 views
0

我想实现一个基本的ftp服务器。ftp的数据通道如何工作?

我知道数据通道是由PASV命令创建的,它创建了一个用于发送文件等数据的新套接字。

我开始执行命令LIST,但我不明白为什么我应该在传输完成时关闭数据套接字。我用于测试的ftp客户端在收到代码226时关闭了与我的数据套接字的连接。

这意味着客户端在每个需要数据通道的命令之前应该执行PASV

我的代码看起来像这样的时刻:

int  list(char **arg, int c_sock, t_data *data) 
{ 
    FILE  *fp; 
    char  path[1035]; 

    write_to_client(c_sock, "150 ", "sending data...\r\n"); 
    fp = popen("/bin/ls /home/login -l", "r"); 
    if (fp == NULL) 
    { 
     printf("Failed to run command\n"); 
     exit(1); 
    } 
    while (fgets(path, sizeof(path)-1, fp) != NULL) 
    { 
     write_to_client(data->data_sock, path, "\0"); 
    } 
    pclose(fp); 
    write_to_client(c_sock, "226 ", "data send\r\n"); 
    close(data->data_sock); 
    return (0); 
} 

回答

1

简短的回答:你需要的,因为这是由FTP协议授权关闭数据插座。 FTP协议说,当套接字关闭时数据传输完成,是的,应该为每次数据传输创建新的连接。

这并不意味着客户端必须在每次传输时重复PASV(或PORT处于活动模式)命令,但只要监听套接字端口保持有效,它就可以重用。

+0

从技术上说,[官方FTP规范](https://tools.ietf.org/html/rfc959)规定,关闭数据套接字以指示EOF只在数据以流模式使用文件结构传输时才有必要(默认组合)。结构模式(记录,页面)和传输模式(块,压缩)的其他组合使用数据连接上的显式EOF指示符,从而允许将相同的数据连接重复用于多次传输。在现代系统中使用这些其他模式并不常见,但它们仍然是官方协议的一部分。 –

+0

@RemyLebeau,有趣。上次我查看RFC是在十多年前,我不知道这个功能。我的FTP客户端不支持它。 – SergeyA