【问题标题】:How the data channel of a ftp is working ?ftp 的数据通道是如何工作的?
【发布时间】:2023-04-03 03:15:01
【问题描述】:

我正在尝试实现一个基本的 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);
}

【问题讨论】:

    标签: c sockets ftp


    【解决方案1】:

    简短回答:您需要关闭数据套接字,因为这是 FTP 协议规定的。 FTP协议说当socket关闭时数据传输就完成了,是的,每次数据传输都应该建立新的连接。

    这并不意味着客户端必须为每次传输重复 PASV(或活动模式下的 PORT)命令,但是 - 只要侦听套接字端口保持有效,它就可以重复使用。

    【讨论】:

    • 从技术上讲,official FTP spec 声明只有在使用流模式(默认组合)的文件结构传输数据时才需要关闭数据套接字以指示 EOF。结构模式(记录、页面)和传输模式(块、压缩)的其他组合在数据连接上使用显式 EOF 指示符,从而允许将同一数据连接重用于多次传输。在现代系统中使用这些其他模式并不常见,但它们仍然是官方协议的一部分。
    • @RemyLebeau,很有趣。上次我研究 RFC 是在十多年前,我不知道那个特性。我的 FTP 客户端不支持它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2022-09-23
    • 2016-12-21
    • 2014-03-02
    • 2013-12-06
    • 2014-10-22
    相关资源
    最近更新 更多