Вкратце, следующий код из IO :: Socket :: INET
sub _get_addr {
my($sock,$addr_str, $multi) = @_;
my @addr;
if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) {
(undef, undef, undef, undef, @addr) = gethostbyname($addr_str);
} else {
my $h = inet_aton($addr_str);
push(@addr, $h) if defined $h;
}
@addr;
}
предлагает (если вы посмотрите на вызывающего этот код) обходной путь добавления MultiHomed => 1,
к вашему коду.
Без этого обходного пути приведенный выше код, по-видимому, пытается вызвать inet_aton("hostname.com")
с помощью inet_aton () из Socket.pm. Это работает для меня как в Win32, так и в Unix, так что, я думаю, в этом и кроется перелом.
См. Socket.xs для получения исходного кода inet_aton:
void
inet_aton(host)
char * host
CODE:
{
struct in_addr ip_address;
struct hostent * phe;
if (phe = gethostbyname(host)) {
Copy( phe->h_addr, &ip_address, phe->h_length, char );
} else {
ip_address.s_addr = inet_addr(host);
}
ST(0) = sv_newmortal();
if(ip_address.s_addr != INADDR_NONE) {
sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
}
}
Похоже, что Perl gethostbyname () работает лучше, чем C gethostbyname () для вас.