FTP 服务器在请求不存在的文件时挂起 ("FTP no transfer timeout")

FTP server hangs when non-existing files are requested ("FTP no transfer timeout")

我有一个 ProFTPD FTP 服务器(版本:1.3.4d(维护)),它可以很好地处理现有文件,但如果 "FTP no transfer timeout" 出现 请求了不存在的文件

这是我在请求不存在的文件时在 proftpd.log 中看到的内容:

May 20 12:05:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): FTP session opened. 
May 20 12:05:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): USER system: Login successful. 
...hangs for 10 Minutes....             
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): Passive data transfer failed, possibly due to network issues 
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): Check your PassivePorts and MasqueradeAddress settings, 
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): and any router, NAT, and firewall rules in the network path. 
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): FTP no transfer timeout, disconnected 
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): ROOT PRIVS: unable to setegid(): Operation not permitted 
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): RELINQUISH PRIVS: unable to seteuid(session.uid): Operation not permitted 
May 20 12:15:04 myhost proftpd[25990] 1.2.3.4 (5.6.7.8[5.6.7.8]): FTP session closed.

这些是在 proftpd.conf 中配置的超时:

TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200

但是,向同一台服务器请求现有文件工作正常。

有人可以帮我解决这个问题吗?

我的问题出在 FTP 客户端,而不是 FTP 服务器。我搭建了一个小型的FtpTester测试工具,可以重现问题,这似乎是EnterpriseDT的edtFTPj FTP客户端的一个bug。如果您在一个不存在的文件上打开一个 FTPInputStream 并在收到 IOException 后关闭它,则 close() 操作将挂起,直到发生套接字超时。

我在 EnterpriseDT 的网站上对此进行了详细描述,请参见。 http://enterprisedt.com/questions/index.php/11407/ftpinputstream-close-hangs-until-socket-timeout

我用这个解决方法解决了我的问题:在打开 FTPInputStream 之前,我明确检查文件是否存在。