代码之家  ›  专栏  ›  技术社区  ›  toto

Delphi 7 Indy IdFTP未发送/接收数据

  •  1
  • toto  · 技术社区  · 7 年前

    我用过 TIdFTP 连接到他们的服务器并获取和放置数据。

    他们在另一个城市开设了另一个办公室,他们想将该程序复制到新的办公电脑上,但该程序在那里不起作用。

    程序成功连接,但无法读取目录列表,也无法放置或获取数据。如果它试图将文件发送到服务器,结果只会是一个空文件!

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

    他们的计算机(不工作)和另一台计算机(工作)之间只有两个不同之处:

    1. 网络服务提供商
    2. 路由器

    他们有4台电脑和一个电缆路由器。

    现在我想问你:

    1. ISP能阻止这样的流量吗?连接成功,但没有其他内容(put、get、list)?

    2. 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);
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Remy Lebeau    7 年前

    这听起来像是网络路由问题。

    FTP使用多个TCP连接。主命令连接和辅助数据传输连接。第一个总是出站,因此不太可能在客户端被阻止。默认情况下,其他连接是入站的,因此很可能在客户端被阻止。这可能是ISP阻塞或路由器阻塞,两者都有可能。

    FTP不是一种路由器友好协议。传输以两种模式之一运行-主动或被动。

    • PORT EPRT

      除非路由器支持uPNP,否则FTP客户端可以编程设置端口转发。 TIdFTP 不实现uPNP,但有第三方uPNP库可用,以及在Windows中实现的uPNP API。

      如果此端口转发设置不正确,FTP客户端将无法与FTP服务器交换数据。假使 Put() ,如果传输失败时服务器不删除文件(以便于以后恢复),则很容易导致服务器上出现空文件。

    • 在被动模式下,当FTP客户端想要传输数据时,它会发送一个 PASV EPSV 命令发送到FTP服务器,然后服务器打开一个侦听端口,并将IP和端口报告给FTP客户端,然后FTP客户端连接到此端口。

      这是来自FTP客户端的出站连接,因此不太可能被ISP阻止,并且不需要在客户端路由器上进行任何端口转发。

    TIdFTP.List() , TIdFTP.Get() TIdFTP.Put() 方法在代码中引发异常。如果这种情况没有发生,那就是出了问题。

    那么,你能做什么?最简单的尝试是设置 TIdFTP.Passive

        2
  •  0
  •   ivan_pozdeev RenanSS    7 年前

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

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