Delphi 7 Indy IdFTP确实发送/接收数据

时间:2017-09-06 07:26:08

标签: delphi-7 indy

2年前,我为使用Delphi 7和Indy通过Internet发送和接收一些数据的人编写了一个简单的客户端/服务器程序。 我使用TIdFTP连接到他们的服务器并获取并放置数据。

它运作良好2年。今天, 他们在另一个城市开设了另一个办公室,他们想把这个程序复制到他们的新办公室电脑上,但该程序在那里没有工作。

程序连接成功,但无法读取目录列表,或者放入或获取数据。如果它试图将文件发送到服务器,它们最终会得到一个空文件!

首先,我认为问题出在防火墙或类似的东西上,但程序在使用和不使用防火墙的Win XP,7或8上都不起作用(我在所有防病毒软件上都禁用了防火墙,甚至Windows防火墙)。我知道防火墙没有问题。

他们的计算机(不起作用)和另一台计算机(确实有效)之间只有两种不同的东西:

  1. ISP
  2. 路由器
  3. 他们有4台电脑和一台有线路由器。

    现在我想问你:

    1. ISP会阻止这样的流量吗?连接成功,但没有其他任何东西(put,get,list)?

    2. 有什么关于路由器和TIdFTP

    3. 我该怎么办?

      我的代码非常简单:

      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);
      

2 个答案:

答案 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客户端报告错误消息,从而导致EPSVTIdFTP.List()和{{ 1}}在代码中引发异常的方法。如果没有发生这种情况,就会出现问题。

那么,你能做什么?最简单的方法是将TIdFTP.Get()属性设置为True,以便所有数据传输连接都是出站的。这通常足以避免任何路由问题。

答案 1 :(得分:0)

使用嗅探器查看网络流量。

最可能的原因是您的FTP客户端默认使用PORT命令(至少在一段时间之前由相应的RFC强制执行),这不会在不执行DPI的NAT后面工作。

但这确实可以处于网络通信的任何阶段 - 从您机器上的某些安全软件,到网络设置问题,企业防火墙,ISP和目标服务器引发的限制。没有看到流量,就不可能说出任何其他内容。