Früher war mehr Lametta. Aber dafür gab es keine IPv6-Adressen. Und so konnte man in der schönen alten Zeit mit einem einfachen:
use Net::hostent 'gethost';
my $ip = '40.77.167.38'; # kommt sonst z.B. aus den Logfiles
print getHostName($ip);
sub getHostName {
my $ip = shift;
my $host = gethost($ip) || undef;
my $hostname = $host ? $host->name : 'na';
return $hostname;
}
den Hostnamen 'msnbot-40-77-167-38.search.msn.com' ermitteln.
Vermehrt tauchen aber jetzt IPv6-Adressen in den Logfiles auf, zum Beispiel: 2a02:598:aaaa:2::8225 - eine der IPs eines tschechischen Suchbots. Mit solchen IPs erhalte ich mit meiner Funktion aus alten Tagen nur 'na' - not available.
Es sieht für mich so aus, als wäre Net::hostent IPv6-inkompatibel. Bei meiner Suche nach einem Lösungsansatz habe ich viel bei Perlmonks und Stack Overflow gelesen, ich denke, wenn es eine modernere Version von Net::hostent gibt, die mit IPv6-Adressen umgehen kann, hätte ich es dort erfahren. Bei den Mönchen wird empfohlen, zwei Methoden von Socket 6 anzuwenden: getnameinfo() und/oder getaddrinfo().
Bei genameinfo() erhalte ich: ai_family not supported, und getaddrinfo() liefert:
my @host2 = getaddrinfo('2a02:598:bbbb:2::8381', Socket6->AF_INET6);
Ausgabe ist ein Array mit 15 Elemente, den habe ich mit join etwas leserlicher gemacht:
element = 10
element = 1
element = 6
element = *˜»»ƒ
element =
element = 10
element = 2
element = 17
element = *˜»»ƒ
element =
element = 10
element = 3
element = 0
element = *˜»»ƒ
element =
Bei Socket6.pm steht für geaddrinfo folgendes:
If the lookup is successful, a list consisting of multiples of
five elements is returned.
Each group of five elements consists of the address family,
socket type, protocol, 16-octet IP address, and the canonical
name (undef if the node name passed is already the canonical name).
Demnach wäre der Hostname undefiniert - oder verstehe ich hier etwas falsch?
VG,
Karin Ute