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

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

  1. 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

    --
    sumpsi - posui - obstruxi
    1. 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

      1. Hallo Karin,

        Hilfe für ein- und mehrzeiligen Code

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf B,

          Hilfe für ein- und mehrzeiligen Code

          Ergänzung: Erreichbar über das rote Fragezeichen oberhalb des Textfeldes.

          Bis demnächst
          Matthias

          --
          Du kannst das Projekt SELFHTML unterstützen,
          indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
          1. Hallo Matthias,

            soviel zum Thema UX. Ich bin immer dem Link "Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge." gefolgt.

            Rolf

            --
            sumpsi - posui - obstruxi