我正在使用c中的一个简单的ftp服务器。我不知道ftp服务器何时接受来自客户端的被动数据连接。据我所知,ftp是被动的:
我的问题是:ftp服务器何时接受与所述随机端口的连接?发送回复后服务器应该接受数据连接吗?或者ftp服务器是否应该在需要数据连接之前接受连接,即当客户端请求文件时?
我有RFC959。还有其他有用的ftp资源吗?谷歌并不是特别有帮助。
提前致谢
答案 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: