Start · Sprachen · PHP · Referenz · socket_bind

socket_bind

Funktion

Verknüpft einen Socket mit einer lokalen IP-Adresse und einem optionalen Port (Binding), sodass der Socket an einer bestimmten Adresse lauschen kann.

seit PHP 4.1.0 Kategorie: http

Signatur

socket_bind(Socket $socket, string $address, int $port = 0): bool

Beschreibung

socket_bind() weist einem zuvor mit socket_create() erzeugten Socket eine lokale Netzwerkadresse und einen Port zu. Dieser Schritt ist bei Server-Sockets zwingend notwendig, bevor mit socket_listen() auf eingehende Verbindungen gewartet werden kann.

Für TCP/UDP-Sockets (Adressfamilie AF_INET oder AF_INET6) muss eine IP-Adresse und ein Port angegeben werden. Soll der Socket auf allen verfügbaren Netzwerk-Interfaces lauschen, verwendet man 0.0.0.0 (IPv4) bzw. :: (IPv6). Ein Port-Wert von 0 lässt das Betriebssystem einen freien Port automatisch wählen.

Für Unix-Domain-Sockets (AF_UNIX) dient als Adresse ein Dateisystempfad (z. B. /tmp/myapp.sock), und der Parameter $port wird ignoriert. Diese Variante eignet sich für die schnelle Interprozesskommunikation auf demselben Rechner.

Schlägt das Binding fehl (z. B. weil der Port bereits belegt ist oder die Berechtigungen fehlen), gibt die Funktion false zurück. Detaillierte Fehlerinformationen liefern socket_last_error() und socket_strerror().

Parameter

Name Typ Default Beschreibung
$socket Pflicht Socket Ein gültiges Socket-Objekt, das zuvor mit socket_create() erzeugt wurde.
$address Pflicht string Die lokale IP-Adresse (z. B. 127.0.0.1, 0.0.0.0) oder bei AF_UNIX-Sockets ein Dateisystempfad (z. B. /tmp/app.sock).
$port int 0 Der lokale Port, an den der Socket gebunden werden soll. Wird nur bei AF_INET- und AF_INET6-Sockets ausgewertet. Der Wert 0 lässt das OS einen freien Port wählen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Binding erfolgreich war, andernfalls false. Im Fehlerfall kann mit socket_last_error($socket) der Fehlercode und mit socket_strerror() eine lesbare Fehlermeldung abgerufen werden.

Beispiele

Einfacher TCP-Server-Socket auf Port 8080

<?php
// Socket erstellen (IPv4, TCP)
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

// SO_REUSEADDR setzen, damit der Port nach Neustart sofort wieder nutzbar ist
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

// Socket an alle Interfaces, Port 8080 binden
if (!socket_bind($socket, '0.0.0.0', 8080)) {
    $errCode = socket_last_error($socket);
    die('socket_bind() fehlgeschlagen: ' . socket_strerror($errCode));
}

echo "Socket erfolgreich an 0.0.0.0:8080 gebunden.\n";

socket_listen($socket);

// Einzelne Verbindung entgegennehmen
$client = socket_accept($socket);
if ($client !== false) {
    socket_write($client, "HTTP/1.0 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!");
    socket_close($client);
}

socket_close($socket);
Socket erfolgreich an 0.0.0.0:8080 gebunden.

UDP-Server mit automatischer Port-Auswahl durch das OS

<?php
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
    die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

// Port 0 => OS wählt freien Port
if (!socket_bind($socket, '127.0.0.1', 0)) {
    die('socket_bind() fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}

// Tatsächlich zugewiesenen Port abfragen
socket_getsockname($socket, $addr, $port);
echo "UDP-Socket gebunden an {$addr}:{$port}\n";

socket_close($socket);
UDP-Socket gebunden an 127.0.0.1:54321

Unix-Domain-Socket für lokale Interprozesskommunikation

<?php
$sockPath = '/tmp/myapp.sock';

// Alten Socket-Pfad ggf. entfernen
if (file_exists($sockPath)) {
    unlink($sockPath);
}

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
if ($socket === false) {
    die('socket_create() fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

if (!socket_bind($socket, $sockPath)) {
    die('socket_bind() fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}

echo "Unix-Socket gebunden an {$sockPath}\n";

socket_listen($socket);
socket_close($socket);
unlink($sockPath);
Unix-Socket gebunden an /tmp/myapp.sock

// Wichtig · Fallstricke

Port bereits belegt: Wenn ein anderer Prozess denselben Port bereits verwendet, schlägt socket_bind() mit dem Fehlercode EADDRINUSE fehl. Setze in diesem Fall die Socket-Option SO_REUSEADDR mit socket_set_option(), um einen schnellen Neustart des Servers zu ermöglichen.

Ports < 1024: Das Binden an privilegierte Ports (0–1023) erfordert unter Unix/Linux Root-Rechte bzw. die Capability CAP_NET_BIND_SERVICE. Läuft das PHP-Skript ohne diese Rechte, schlägt socket_bind() mit EACCES fehl.

Reihenfolge beachten: socket_bind() muss vor socket_listen() und socket_connect() aufgerufen werden. Ein mehrfaches Binden desselben Sockets ist nicht zulässig und führt zu einem Fehler.

IPv6: Bei der Verwendung von AF_INET6 muss eine gültige IPv6-Adresse (z. B. ::1 oder ::) übergeben werden. Gemischte IPv4/IPv6-Nutzung hängt von der Systemkonfiguration und der Option IPV6_V6ONLY ab.