FTP服务器何时接受来自客户端的被动数据连接?

时间:2009-09-04 00:25:01

标签: c ftp

我正在使用c中的一个简单的ftp服务器。我不知道ftp服务器何时接受来自客户端的被动数据连接。据我所知,ftp是被动的:

  1. 客户端向服务器发送“PASV”命令
  2. 服务器创建并绑定套接字,并侦听随机端口。
  3. 服务器使用getsockname获取随机端口
  4. 以格式组装被动回复消息:227进入被动模式(a1,a2,a3,a4,a5,a6)。 注意:服务器ip是a1.a2.a3.a4,端口号是:a5 * 256 + a6。
  5. 我的问题是:ftp服务器何时接受与所述随机端口的连接?发送回复后服务器应该接受数据连接吗?或者ftp服务器是否应该在需要数据连接之前接受连接,即当客户端请求文件时?

    我有RFC959。还有其他有用的ftp资源吗?谷歌并不是特别有帮助。

    提前致谢

3 个答案:

答案 0 :(得分:5)

我会让服务器在发送227回复之前开始接受该端口上的连接(通过调用listen()。如果您等到发送227之后,客户端可能尝试连接,然后才接受连接,并收到“连接被拒绝”错误。

在调用启动TCP系统侦听的listen()之后,只要您准备好开始接受连接,就可以调用accept()。何时调用这是一个应用程序级决策(但显然一旦客户端发送数据传输命令,它就会想要连接)。来自客户端的连接将在接受队列中等待,直到服务器实际调用accept(),从而将它们从接受队列中删除。

答案 1 :(得分:1)

仅当客户端需要传输时才会打开此端口。然后,服务器(必须知道自己的外部IP地址)将告诉客户端连接的位置,包括IP(4字节)和端口(以2个单独的字节),以便它可以传输数据。这种格式的东西:

printf("227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\n",
(unsigned int)((my_ip >> 24) & 0xff),
(unsigned int)((my_ip >> 16) & 0xff),
(unsigned int)((my_ip >> 8) & 0xff),
(unsigned int)(my_ip & 0xff),
(unsigned int)(this_session->pasv_port >> 8),
(unsigned int)(this_session->pasv_port & 0xff));

当用户需要LIST,RETR,STOR或其他一些转移时,使用该端口。

我想处于被动模式的客户端将要求PASV始终在任何LIST,RETR或STOR之前进行并发传输。

我建议您安装和学习FileZilla客户端和服务器。它们都显示了所有原始FTP谈话,因此您可以理解最新情况以及您的计划会发生什么。

答案 2 :(得分:0)

恕我直言,实施FTP的最佳资源是http://cr.yp.to/ftp.html

您可能会发现最近有用的FTP RFC: