0

我们公司的笔记本电脑通过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() 返回“alive”,但 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 地址首先从 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 库不应该给用户带来这样的惊喜。

4

2 回答 2

0

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

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

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

于 2015-08-26T13:25:42.487 回答
0

解决方案似乎很明显:获取 IP 地址,ping 它们,找出哪个是活动的,然后在Net::FTP构造函数中使用 IP 地址而不是主机名。

于 2015-08-26T17:19:54.553 回答