Karin Ute Pridac: Hostname ausgehend von einer IPv6-Adresse herausfinden (Perl)

Beitrag lesen

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