Signatur
Beschreibung
socket_addrinfo_bind() kombiniert die Schritte der Socket-Erstellung und des Bindens in einem einzigen Aufruf. Es erzeugt intern einen neuen Socket passend zum Protokollfamilien-Typ der übergebenen AddressInfo-Struktur und bindet ihn sofort an die enthaltene Netzwerkadresse (IPv4, IPv6 oder Unix-Domain-Socket).
AddressInfo-Objekte werden typischerweise durch socket_addrinfo_lookup() erzeugt, welche einen Hostnamen und einen Port auflöst und eine Liste möglicher Adressen zurückgibt. socket_addrinfo_bind() ist besonders nützlich beim Aufbau von Server-Sockets, da es die manuelle Erstellung via socket_create() und anschließendem socket_bind() ersetzt und gleichzeitig IPv4/IPv6-Dual-Stack-Szenarien vereinfacht.
Nach erfolgreichem Aufruf kann der zurückgegebene Socket direkt mit socket_listen() auf eingehende Verbindungen warten. Im Fehlerfall gibt die Funktion false zurück; Fehlerinformationen lassen sich mit socket_last_error() abfragen.
Diese Funktion gehört zur modernisierten Socket-API, die in PHP 8.0 auf objektorientierte Typen (Socket, AddressInfo) umgestellt wurde und die alten Ressource-basierten Handles ersetzt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $address Pflicht | AddressInfo | Eine AddressInfo-Instanz, die typischerweise von socket_addrinfo_lookup() zurückgegeben wird. Sie enthält alle nötigen Informationen (Protokollfamilie, Sockettyp, Adresse, Port), um den Socket zu erstellen und zu binden. |
Rückgabewert
Socket-Objekt zurück, das bereits an die in $address enthaltene Adresse gebunden ist. Bei einem Fehler (z. B. Adresse bereits belegt, fehlende Berechtigungen) wird false zurückgegeben.Beispiele
Einfachen TCP-Server-Socket über addrinfo erstellen und binden
<?php
// Adressinformationen für localhost auf Port 8080 auflösen
$addrinfos = socket_addrinfo_lookup('localhost', '8080', [
'ai_socktype' => SOCK_STREAM, // TCP
]);
if ($addrinfos === false || count($addrinfos) === 0) {
die('Adressauflösung fehlgeschlagen');
}
$socket = null;
foreach ($addrinfos as $addrinfo) {
$socket = socket_addrinfo_bind($addrinfo);
if ($socket !== false) {
echo "Socket erfolgreich erstellt und gebunden.\n";
break;
}
}
if ($socket === false) {
die('Binden fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}
// Auf Verbindungen lauschen
socket_listen($socket, 5);
echo "Server lauscht auf localhost:8080\n";
socket_close($socket);
IPv6-fähigen Server mit Fallback auf IPv4 erstellen
<?php
// Auflösung liefert ggf. sowohl IPv6 als auch IPv4 Einträge
$addrinfos = socket_addrinfo_lookup('::1', '9000', [
'ai_socktype' => SOCK_STREAM,
'ai_flags' => AI_PASSIVE,
]);
if (empty($addrinfos)) {
die('Keine Adressinformationen gefunden.');
}
foreach ($addrinfos as $addrinfo) {
$sock = socket_addrinfo_bind($addrinfo);
if ($sock !== false) {
echo "Gebunden. Lausche auf Port 9000 ...\n";
socket_listen($sock, 10);
// Hier würde der Akzeptier-Loop folgen
socket_close($sock);
break;
} else {
echo "Bind-Versuch fehlgeschlagen, versuche nächste Adresse ...\n";
}
}
// Wichtig · Fallstricke
Berechtigungen: Das Binden an Ports unter 1024 erfordert unter Unix/Linux Root-Rechte oder die Capability CAP_NET_BIND_SERVICE. Andernfalls schlägt der Aufruf mit einem Berechtigungsfehler fehl.
Adresse bereits belegt: Falls der Port bereits in Benutzung ist (z. B. nach einem Programm-Absturz), kann das Setzen der Socket-Option SO_REUSEADDR mit socket_set_option() helfen – jedoch erst nach manueller Socket-Erstellung, da socket_addrinfo_bind() den Socket intern erzeugt und keine Möglichkeit bietet, Optionen vor dem Binden zu setzen. In solchen Fällen sollte stattdessen der klassische Weg über socket_create(), socket_set_option() und socket_bind() gewählt werden.
PHP-8.0-Änderung: Ab PHP 8.0 gibt die Funktion ein Socket-Objekt statt einer Ressource zurück. Code, der mit is_resource() prüft, muss auf $socket instanceof Socket umgestellt werden.