我们公司的笔记本电脑通过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 库不应该给用户带来这样的惊喜。