【问题标题】:Getting files from Windows host with Perls Net::FTP使用 Perls Net::FTP 从 Windows 主机获取文件
【发布时间】:2015-11-20 11:17:02
【问题描述】:

我们公司的笔记本电脑通过 LAN(工作场所)或 WLAN(会议室)访问网络。根据他们上网的方式,他们从 DHCP 获得不同的 IP。
服务器上的某些 Perl 应用程序使用 Net::FTP 从客户端(例如上面的笔记本电脑)复制文件。这段代码如下所示:

# don't wait for ftp-timeout if the host is not reachable
my $alive = Net::Ping::External(host => $clnt_host);
if ($alive) {
    $ftp = Net::FTP->new($clnt_host, Debug => 0, Timeout => 200)
    or return "Cannot connect to $clnt_host: $@\n";
    ....
    ....
}
else {
  dbgout(1, "Host $clnt_host unreachable.\n");
  $st = "'FTPGETFAILED'";
  return ($st);
}

有时上面的代码不起作用:Net::Ping::External() 返回“活动”,但 Net::FTP->new() 得到“超时”。

显然,“FTP”和“ping”解析主机名的方式不同。
在 OS 上 ping reslove 如下:

C:\Users\converter>ping -n 1 lap314-034

Ping wird ausgeführt für lap314-034.domain.de [10.140.12.110] mit 32 Bytes Daten:
Antwort von 10.140.12.110: Bytes=32 Zeit=2ms TTL=127

但是,“nslookup”返回 2 种可能性:

C:\Users\converter>nslookup lap314-034
Server:  domaincontroller.domain.de
Address:  123.123.123.123

Name:    lap314-034.domain.de
Addresses:  10.192.3.145
          10.140.12.110

不活动的 IP 地址从 first 位置的 nslookup 传递。
我想 Net::FTP 也使用这个地址连接到客户端。

如何“说服” FTP 使用活动的 DNS 条目进行连接?

================================================ ===============

感谢您的回答。我听从了你的建议。解决方案基于:http://code.activestate.com/lists/perl-win32-users/32624/

#------------------------------------------------------------------
sub getActiveIP {
#------------------------------------------------------------------
  my $hostname     = shift;

  my $host = (gethostbyname ($hostname))[0] or return undef;
  my @addr = gethostbyname ($host);
  # delete the first 4 array elements
  splice @addr, 0, 4;
  foreach (@addr) {
    my $IPstr = sprintf ("%s", &inet_ntoa ($_));
    my $alive = ping(host => $IPstr);
    if ($alive) {
      return $IPstr;
    }
  }
  return undef;
}

尽管如此,我相信一个广泛使用的 Perl 库不应该给用户带来这样的惊喜。

【问题讨论】:

  • 显然,我测试了 FTP-Server 是否正常运行并且登录名/密码是否正常。
  • 感谢您的回答。我听从了你的建议:

标签: perl dns net-ftp


【解决方案1】:

解决方案似乎很明显:获取 IP 地址,对其进行 ping 操作,确定哪个是活动的,然后在 Net::FTP 构造函数中使用 IP 地址而不是主机名。

【讨论】:

    【解决方案2】:

    如何“说服” FTP 使用活动的 DNS 条目进行连接?

    没有好办法让 Net::FTP 决定。 相反,您应该在 Net::FTP 之外确定它,然后使用可用的 IP 地址代替 Net::FTP 中的主机名。

    也许您只能将 Net::FTP 与新版本 (Net::FTP > 3.0) 一起使用,新版本可以使用 IO::Socket::IP 而不是 IO::Socket::INET 作为底层模块.该模块可以尝试为主机名返回的所有 IP 地址,直到连接成功。但是这些重试将针对每个连接进行,即控制连接和每次数据传输。由于与非活动主机的连接仅在超时后才会失败,所以一切都会非常缓慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      相关资源
      最近更新 更多