Hostname ausgehend von einer IPv6-Adresse herausfinden (Perl)
Karin Ute Pridac
- perl
0 Rolf B0 Karin Ute Pridac0 Rolf B0 Matthias Apsel0 Rolf B
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
Hallo Karin,
ich habe keine Ahnung von Perl, aber ich kann formatieren 😉
Vor dem Code ein ~~~pl
, und dahinter ein ~~~
, und schon sieht's schön aus. So schön, wie es mit Perl eben geht...
Rolf
Hi Rolf!
Ich hatte mich gewundert, warum meine Returns verschwunden waren. Hatte auch die Hilfe nicht gefunden, wo erklärt wird, wie man den Code formatiert. Bin auch blond...
Test:
use Modul::XY;
my $test = methodAusModul(arg);
print $test;
VG,
Karin Ute
Hallo Rolf B,
Ergänzung: Erreichbar über das rote Fragezeichen oberhalb des Textfeldes.
Bis demnächst
Matthias
Hallo Matthias,
soviel zum Thema UX. Ich bin immer dem Link "Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge." gefolgt.
Rolf