Start · Sprachen · PHP · Referenz · socket_addrinfo_explain

socket_addrinfo_explain

Funktion

Liefert ein assoziatives Array mit detaillierten Informationen zu einer <code>AddressInfo</code>-Struktur.

seit PHP 7.2.0 Kategorie: http

Signatur

socket_addrinfo_explain(AddressInfo $address): array

Beschreibung

socket_addrinfo_explain() analysiert eine AddressInfo-Ressource (bzw. ab PHP 8.0 ein AddressInfo-Objekt), die zuvor über socket_addrinfo_lookup() ermittelt wurde, und gibt deren Inhalte als assoziatives PHP-Array zurück. So können Programmierer die Eigenschaften einer Netzwerkadresse (Adressfamilie, Socket-Typ, Protokoll, tatsächliche Adresse usw.) auslesen, ohne direkt mit der internen C-Struktur arbeiten zu müssen.

Das zurückgegebene Array enthält typischerweise die Schlüssel ai_flags, ai_family, ai_socktype, ai_protocol und ai_addr. Der Schlüssel ai_addr ist selbst wieder ein Array mit den Schlüsseln sin_port (bei IPv4/IPv6) und sin_addr bzw. sin6_addr für die eigentliche IP-Adresse.

Die Funktion ist besonders nützlich, wenn man mehrere von socket_addrinfo_lookup() gelieferte Einträge vor dem Verbindungsaufbau prüfen und filtern möchte, z. B. um ausschließlich IPv6-Adressen oder nur TCP-Sockets auszuwählen.

Parameter

Name Typ Default Beschreibung
$address Pflicht AddressInfo Ein AddressInfo-Objekt, wie es von socket_addrinfo_lookup() zurückgegeben wird.

Rückgabewert

Typ
array
Beschreibung
Ein assoziatives Array mit den Feldern der zugrundeliegenden addrinfo-Struktur. Enthält mindestens die Schlüssel ai_flags, ai_family, ai_socktype, ai_protocol und ai_addr.

Beispiele

Adressinformationen zu einem Hostnamen auflesen

<?php
// Adressinformationen für 'example.com' auf Port 443 abfragen
$hints = [
    'ai_family'   => AF_UNSPEC,
    'ai_socktype' => SOCK_STREAM,
];

$addrinfos = socket_addrinfo_lookup('example.com', '443', $hints);

if ($addrinfos === false) {
    die('Lookup fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

foreach ($addrinfos as $addrinfo) {
    $info = socket_addrinfo_explain($addrinfo);
    echo 'Familie  : ' . $info['ai_family']   . PHP_EOL;
    echo 'Typ      : ' . $info['ai_socktype'] . PHP_EOL;
    echo 'Protokoll: ' . $info['ai_protocol'] . PHP_EOL;
    echo 'Adresse  : ' . $info['ai_addr']['sin_addr'] . PHP_EOL;
    echo '---' . PHP_EOL;
}
Familie : 2 Typ : 1 Protokoll: 6 Adresse : 93.184.216.34 ---

Nur IPv6-Adressen aus dem Lookup-Ergebnis filtern

<?php
$hints = [
    'ai_family'   => AF_UNSPEC,
    'ai_socktype' => SOCK_STREAM,
];

$addrinfos = socket_addrinfo_lookup('example.com', '80', $hints);

$ipv6Only = array_filter($addrinfos, function (AddressInfo $ai): bool {
    $info = socket_addrinfo_explain($ai);
    return $info['ai_family'] === AF_INET6;
});

foreach ($ipv6Only as $ai) {
    $info = socket_addrinfo_explain($ai);
    echo 'IPv6-Adresse: ' . ($info['ai_addr']['sin6_addr'] ?? 'unbekannt') . PHP_EOL;
}
IPv6-Adresse: 2606:2800:220:1:248:1893:25c8:1946

// Wichtig · Fallstricke

PHP-Version: Ab PHP 8.0 werden addrinfo-Ressourcen als AddressInfo-Objekte repräsentiert. In PHP 7.2–7.4 handelt es sich noch um Ressourcen (resource).

Die Schlüssel und Werte des zurückgegebenen Arrays entsprechen den Konstanten der Socket-Erweiterung (z. B. AF_INET, AF_INET6, SOCK_STREAM). Ein direkter Vergleich mit diesen Konstanten ist empfehlenswert.

Nicht alle Schlüssel sind auf jedem Betriebssystem vorhanden; fehlende Einträge sollten mit isset() geprüft werden.