Start · Sprachen · PHP · Referenz · socket_addrinfo_connect

socket_addrinfo_connect

Funktion

Erstellt einen Socket aus einer <code>AddressInfo</code>-Struktur und verbindet ihn sofort mit der angegebenen Adresse.

seit PHP 7.2.0 Kategorie: http

Signatur

socket_addrinfo_connect(AddressInfo $address): Socket|false

Beschreibung

socket_addrinfo_connect() nimmt ein AddressInfo-Objekt, wie es von socket_addrinfo_lookup() zurückgegeben wird, erzeugt daraus intern einen passend konfigurierten Socket und stellt direkt eine Verbindung zu der in der Struktur enthaltenen Adresse her. Der Rückgabewert ist bei Erfolg eine Socket-Ressource, die sofort für Sende- und Empfangsoperationen verwendet werden kann.

Der Hauptvorteil gegenüber dem manuellen Weg (socket_create() + socket_connect()) besteht darin, dass Adressfamilie, Socket-Typ und Protokoll automatisch aus der AddressInfo-Struktur entnommen werden. Dadurch ist der Code sowohl IPv4- als auch IPv6-kompatibel, ohne explizit zwischen den Protokollen unterscheiden zu müssen.

Typischer Einsatz ist das Herstellen ausgehender TCP- oder UDP-Verbindungen zu einem Hostnamen, bei dem zunächst socket_addrinfo_lookup() aufgerufen wird, um eine Liste möglicher Adressen zu erhalten. Anschließend iteriert man über die Liste und versucht für jede Adresse einen Verbindungsaufbau mit socket_addrinfo_connect(), bis einer erfolgreich ist (Happy-Eyeballs-Muster).

Nach Abschluss aller Operationen sollte der Socket mit socket_close() freigegeben werden, um Ressourcenlecks zu vermeiden.

Parameter

Name Typ Default Beschreibung
$address Pflicht AddressInfo Ein AddressInfo-Objekt, das von socket_addrinfo_lookup() zurückgegeben wurde. Es enthält Adressfamilie, Socket-Typ, Protokoll sowie Zieladresse und Port.

Rückgabewert

Typ
Socket|false
Beschreibung
Gibt bei Erfolg ein Socket-Objekt zurück, das bereits mit der Zieladresse verbunden ist. Im Fehlerfall wird false zurückgegeben; Fehlerdetails können über socket_last_error() und socket_strerror() abgerufen werden.

Beispiele

TCP-Verbindung zu einem HTTP-Server aufbauen

<?php
// Adressinformationen für example.com auf Port 80 auflösen
$hints = [
    'ai_socktype' => SOCK_STREAM,
    'ai_protocol' => SOL_TCP,
];
$addrinfos = socket_addrinfo_lookup('example.com', '80', $hints);

if (!$addrinfos) {
    die('Namensauflösung fehlgeschlagen.');
}

$socket = false;
foreach ($addrinfos as $addrinfo) {
    $socket = socket_addrinfo_connect($addrinfo);
    if ($socket !== false) {
        echo "Verbindung erfolgreich hergestellt!" . PHP_EOL;
        break;
    }
}

if ($socket === false) {
    die('Konnte keine Verbindung herstellen: ' . socket_strerror(socket_last_error()));
}

// Einfache HTTP/1.0-Anfrage senden
$request = "GET / HTTP/1.0\r\nHost: example.com\r\nConnection: close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// Antwort einlesen
$response = '';
while ($chunk = socket_read($socket, 2048)) {
    $response .= $chunk;
}

socket_close($socket);

// Ersten 200 Zeichen der Antwort ausgeben
echo substr($response, 0, 200) . PHP_EOL;
Verbindung erfolgreich hergestellt! HTTP/1.0 200 OK ...

IPv4- und IPv6-Fallback (Happy-Eyeballs-ähnlich)

<?php
$host = 'ipv6.google.com';
$port = '80';

$hints = ['ai_socktype' => SOCK_STREAM];
$addrinfos = socket_addrinfo_lookup($host, $port, $hints);

if (empty($addrinfos)) {
    die("Keine Adressinformationen gefunden für $host");
}

$socket = false;
foreach ($addrinfos as $addrinfo) {
    $socket = socket_addrinfo_connect($addrinfo);
    if ($socket !== false) {
        echo "Verbunden mit $host:$port" . PHP_EOL;
        break;
    }
    echo "Verbindungsversuch fehlgeschlagen, nächste Adresse..." . PHP_EOL;
}

if ($socket === false) {
    die('Alle Verbindungsversuche fehlgeschlagen.');
}

socket_close($socket);
Verbunden mit ipv6.google.com:80

// Wichtig · Fallstricke

Verfügbarkeit: Die Funktion ist ab PHP 7.2.0 verfügbar und setzt voraus, dass PHP mit Socket-Unterstützung kompiliert wurde (Extension sockets).

Blockierender Modus: Der erstellte Socket befindet sich standardmäßig im blockierenden Modus. Für nicht-blockierende Anwendungen muss nach dem Verbindungsaufbau socket_set_nonblock() aufgerufen werden.

Ressourcenverwaltung: Nicht mehr benötigte Sockets müssen explizit mit socket_close() geschlossen werden, da PHP Sockets nicht automatisch freigibt.

Fehlerbehandlung: Bei einem Rückgabewert von false liefert socket_last_error() den Fehlercode, socket_strerror() die lesbare Fehlermeldung. Es wird keine Exception geworfen.