Start · Sprachen · PHP · Referenz · socket_create_listen

socket_create_listen

Funktion

Erstellt einen TCP-Socket, der auf dem angegebenen Port auf eingehende Verbindungen wartet.

seit PHP 4.1.0 Kategorie: http

Signatur

socket_create_listen(int $port, int $backlog = 128): Socket|false

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

Typ
Socket|false
Beschreibung
Gibt bei Erfolg eine 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;
Server lauscht auf Port 8080 ... Empfangen: Hallo Welt Verbindung geschlossen.

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);
Warte auf Verbindungen auf Port 9000 ...

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