Signatur
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
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;
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);
// 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.