Start · Sprachen · PHP · Referenz · socket_addrinfo_bind

socket_addrinfo_bind

Funktion

Erstellt einen Socket aus einer <code>AddressInfo</code>-Struktur und bindet ihn an die darin enthaltene Adresse und den Port.

seit PHP 7.2.0 Kategorie: http

Signatur

socket_addrinfo_bind(AddressInfo $address): Socket|false

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

Typ
Socket|false
Beschreibung
Gibt bei Erfolg ein 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);
Socket erfolgreich erstellt und gebunden. Server lauscht auf localhost:8080

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";
    }
}
Gebunden. Lausche auf Port 9000 ...

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