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);
}
从技术上说,[官方FTP规范](https://tools.ietf.org/html/rfc959)规定,关闭数据套接字以指示EOF只在数据以流模式使用文件结构传输时才有必要(默认组合)。结构模式(记录,页面)和传输模式(块,压缩)的其他组合使用数据连接上的显式EOF指示符,从而允许将相同的数据连接重复用于多次传输。在现代系统中使用这些其他模式并不常见,但它们仍然是官方协议的一部分。 –
@RemyLebeau,有趣。上次我查看RFC是在十多年前,我不知道这个功能。我的FTP客户端不支持它。 – SergeyA