Signatur
Beschreibung
socket_create_listen() ist eine vereinfachte Hilfsfunktion, die einen TCP-Socket erstellt, ihn an den angegebenen Port auf allen verfügbaren Netzwerkschnittstellen bindet (INADDR_ANY, also 0.0.0.0) und ihn in den Lausch-Modus versetzt. Sie kombiniert damit intern die Schritte von socket_create(), socket_bind() und socket_listen() in einem einzigen Aufruf.
Die Funktion eignet sich besonders für schnelle Prototypen oder einfache Server-Skripte, bei denen keine feine Kontrolle über die Socket-Optionen oder die Bind-Adresse benötigt wird. Soll z. B. nur auf IPv4-Loopback oder eine bestimmte IP-Adresse gebunden werden, sind die einzelnen Schritte mit socket_create(), socket_bind() und socket_listen() flexibler.
Der Parameter backlog legt die Länge der Warteschlange für ausstehende Verbindungen fest. Verbindungen, die ankommen, während der Server beschäftigt ist, werden bis zu dieser Anzahl in der Warteschlange gehalten. Typische Werte liegen zwischen 5 und 128; das Betriebssystem kann den Wert nach oben oder unten begrenzen.
Nach dem erfolgreichen Aufruf kann mit socket_accept() eine anstehende Verbindung angenommen und als neuer Socket weiterverarbeitet werden. Im Fehlerfall gibt die Funktion false zurück; der Fehlercode ist dann über socket_last_error() abrufbar.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $port Pflicht | int | Der TCP-Port, auf dem der Socket lauschen soll (1–65535). Port 0 weist dem Betriebssystem die Wahl eines freien Ports zu. | |
| $backlog | int | 128 | Maximale Anzahl ausstehender Verbindungen in der Warteschlange. Das Betriebssystem kann diesen Wert begrenzen. |
Rückgabewert
Socket-Instanz zurück, die zum Annehmen von Verbindungen verwendet werden kann. Bei einem Fehler wird false zurückgegeben; der Fehlercode ist über socket_last_error() abfragbar.Beispiele
Einfacher TCP-Echo-Server
<?php
$port = 8080;
$server = socket_create_listen($port, 10);
if ($server === false) {
$errCode = socket_last_error();
die('Fehler beim Erstellen des Sockets: ' . socket_strerror($errCode) . PHP_EOL);
}
echo "Server lauscht auf Port $port ..." . PHP_EOL;
// Einzelne Verbindung annehmen
$client = socket_accept($server);
if ($client === false) {
die('socket_accept fehlgeschlagen: ' . socket_strerror(socket_last_error($server)) . PHP_EOL);
}
// Nachricht vom Client lesen
$data = socket_read($client, 1024, PHP_NORMAL_READ);
echo 'Empfangen: ' . trim($data) . PHP_EOL;
// Nachricht zurückschicken (Echo)
socket_write($client, $data, strlen($data));
socket_close($client);
socket_close($server);
echo 'Verbindung geschlossen.' . PHP_EOL;
Mehrere Verbindungen in einer Schleife annehmen
<?php
$server = socket_create_listen(9000, 5);
if ($server === false) {
die('Konnte Socket nicht erstellen: ' . socket_strerror(socket_last_error()) . PHP_EOL);
}
socket_set_nonblock($server); // Nicht-blockierend für Polling
echo 'Warte auf Verbindungen auf Port 9000 ...' . PHP_EOL;
$running = true;
while ($running) {
$client = @socket_accept($server);
if ($client !== false) {
socket_write($client, "Willkommen!\n");
socket_close($client);
echo 'Client bedient.' . PHP_EOL;
} else {
// Kurz warten, bevor erneut geprüft wird
usleep(100_000);
}
// Abbruch nach einer fiktiven Bedingung (z. B. Signal)
// $running = false;
}
socket_close($server);
// Wichtig · Fallstricke
Portfreigabe: Unter Linux/macOS kann nach einem Neustart des Skripts der Port kurzzeitig im Status TIME_WAIT verbleiben. Um dies zu vermeiden, kann die Socket-Option SO_REUSEADDR gesetzt werden – dies ist mit socket_create_listen() jedoch nicht direkt möglich, da die Funktion intern bereits bindet. In diesem Fall sind socket_create(), socket_set_option(), socket_bind() und socket_listen() einzeln aufzurufen.
IPv6: socket_create_listen() bindet ausschließlich an IPv4 (AF_INET). Für IPv6-Unterstützung muss socket_create() mit AF_INET6 verwendet werden.
Sicherheit: Ein Server, der auf 0.0.0.0 lauscht, ist auf allen Netzwerkschnittstellen erreichbar. Stellen Sie sicher, dass Firewall-Regeln den Zugriff auf vertrauenswürdige Quellen einschränken. Lesen Sie eingehende Daten stets validiert und begrenzt (max. Puffergröße), um Pufferüberläufe oder Denial-of-Service-Angriffe zu vermeiden.