TIdFTP
连接到他们的服务器并获取并放置数据。
它运作良好2年。今天, 他们在另一个城市开设了另一个办公室,他们想把这个程序复制到他们的新办公室电脑上,但该程序在那里没有工作。
程序连接成功,但无法读取目录列表,或者放入或获取数据。如果它试图将文件发送到服务器,它们最终会得到一个空文件!
首先,我认为问题出在防火墙或类似的东西上,但程序在使用和不使用防火墙的Win XP,7或8上都不起作用(我在所有防病毒软件上都禁用了防火墙,甚至Windows防火墙)。我知道防火墙没有问题。
他们的计算机(不起作用)和另一台计算机(确实有效)之间只有两种不同的东西:
他们有4台电脑和一台有线路由器。
现在我想问你:
ISP会阻止这样的流量吗?连接成功,但没有其他任何东西(put,get,list)?
有什么关于路由器和TIdFTP
?
我该怎么办?
我的代码非常简单:
idftp1.Port:=21;
idftp1.Host:='ftp.***.ir';
idftp1.Username:='ftp@***.ir';
idftp1.Password:='***';
idftp1.Connect;
fp:='c:\download';
idftp1.ChangeDir('***');
idftp1.Put(fp+'\message.rhp','message.rhp',false);
答案 0 :(得分:1)
FTP使用多个TCP连接。主命令连接和辅助数据传输连接。第一个总是出站,因此不太可能在客户端被阻止。默认情况下,其他连接是入站的,因此很可能在客户端阻止。这可能是ISP阻塞或路由器阻塞,两者都是可能的。
ISP可能会阻止入站连接。 ISP通常不喜欢运行自己的服务器的用户而不需要支付额外费用。默认情况下,FTP传输以类似服务器的模式运行。检查ISP是否阻止入站连接。
FTP不是路由器友好协议。传输以两种模式之一运行 - 主动或被动。
在活动模式(默认)下,当FTP客户端想要传输数据时,它会打开一个侦听端口,并通过PORT
或{{1}将IP和端口报告给FTP服务器命令,然后FTP服务器连接到此端口。
这是到FTP客户端的入站连接,因此需要在客户端的路由器上配置端口转发。有些路由器支持FTP,可以识别这些FTP命令,因此可以自动设置端口转发。
但是,大多数路由器并不聪明,需要管理员手动设置端口转发。
除非路由器支持uPNP,否则FTP客户端可以以可编程方式设置端口转发。 EPRT
未实现uPNP,但有第三方uPNP库可用,以及Windows自身实现的uPNP API。
如果未正确设置此端口转发,则FTP客户端无法与FTP服务器交换数据。在TIdFTP
的情况下,如果服务器在传输失败时没有删除文件(以便以后恢复),这很容易导致服务器上出现空文件。
在被动模式下,当FTP客户端想要传输数据时,它会向FTP服务器发送Put()
或PASV
命令,然后FTP服务器打开一个侦听端口并报告IP和端口到FTP客户端,然后FTP客户端连接到此端口。
这是来自FTP客户端的出站连接,因此它不太可能被ISP阻止,并且不需要在客户端路由器上进行任何端口转发。
当无法建立数据传输连接时,在任一模式下,FTP服务器都应通过命令连接向FTP客户端报告错误消息,从而导致EPSV
,TIdFTP.List()
和{{ 1}}在代码中引发异常的方法。如果没有发生这种情况,就会出现问题。
那么,你能做什么?最简单的方法是将TIdFTP.Get()
属性设置为True,以便所有数据传输连接都是出站的。这通常足以避免任何路由问题。
答案 1 :(得分:0)
使用嗅探器查看网络流量。
最可能的原因是您的FTP客户端默认使用PORT命令(至少在一段时间之前由相应的RFC强制执行),这不会在不执行DPI的NAT后面工作。
但这确实可以处于网络通信的任何阶段 - 从您机器上的某些安全软件,到网络设置问题,企业防火墙,ISP和目标服务器引发的限制。没有看到流量,就不可能说出任何其他内容。