Start · Sprachen · PHP · Referenz · socket_create

socket_create

Funktion

Erstellt einen neuen Socket (Kommunikationsendpunkt) und gibt ein <code>Socket</code>-Objekt zurück.

seit PHP 4.1.0 Kategorie: http

Signatur

socket_create(int $domain, int $type, int $protocol): Socket|false

Beschreibung

socket_create() erzeugt einen neuen Socket, der als Endpunkt für die Netzwerkkommunikation dient. Ein Socket ist vergleichbar mit einem Datei-Handle, über das Daten gesendet und empfangen werden können – sowohl über TCP/IP als auch über UDP oder Unix-Domain-Sockets.

Der Parameter $domain legt das Kommunikationsprotokoll fest (z. B. IPv4 mit AF_INET, IPv6 mit AF_INET6 oder lokale Unix-Sockets mit AF_UNIX). Der Parameter $type bestimmt den Verbindungstyp: SOCK_STREAM steht für verbindungsorientierte, zuverlässige Byteströme (TCP), während SOCK_DGRAM für verbindungslose Datagramme (UDP) steht.

Der erzeugte Socket muss anschließend je nach Einsatzzweck mit Funktionen wie socket_bind(), socket_listen(), socket_accept() (Server) oder socket_connect() (Client) weiterverwendet werden. Ab PHP 8.0 wird statt einer Ressource ein Socket-Objekt zurückgegeben.

Die Funktion ist besonders nützlich für Low-Level-Netzwerkanwendungen, bei denen mehr Kontrolle als mit höherstufigen Abstraktionen wie Streams (stream_socket_client()) benötigt wird – etwa für eigene Protokoll-Implementierungen oder spezielle Server-Architekturen.

Parameter

Name Typ Default Beschreibung
$domain Pflicht int Gibt die Protokollfamilie an. Typische Werte: AF_INET (IPv4), AF_INET6 (IPv6), AF_UNIX (lokale Unix-Domain-Sockets).
$type Pflicht int Legt den Socket-Typ fest. SOCK_STREAM für verbindungsorientierte Kommunikation (TCP), SOCK_DGRAM für verbindungslose Kommunikation (UDP), SOCK_RAW für Raw-Sockets.
$protocol Pflicht int Das zu verwendende Protokoll innerhalb der angegebenen Domain. Typische Werte: SOL_TCP (6) für TCP, SOL_UDP (17) für UDP. Bei AF_UNIX wird 0 übergeben.

Rückgabewert

Typ
Socket|false
Beschreibung
Gibt bei Erfolg ein Socket-Objekt (ab PHP 8.0) bzw. eine Socket-Ressource (PHP 7.x und früher) zurück. Im Fehlerfall wird false zurückgegeben. Der Fehlercode kann mit socket_last_error() abgerufen werden.

Beispiele

Einfacher TCP-Client-Socket (IPv4)

<?php
// TCP-Socket für IPv4 erstellen
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if ($socket === false) {
    $errorCode = socket_last_error();
    $errorMsg  = socket_strerror($errorCode);
    die("Socket konnte nicht erstellt werden: [$errorCode] $errorMsg");
}

// Mit einem HTTP-Server verbinden
$result = socket_connect($socket, 'example.com', 80);

if ($result === false) {
    die('Verbindung fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}

// HTTP-Anfrage senden
$request = "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// Antwort lesen
$response = '';
while ($chunk = socket_read($socket, 2048)) {
    $response .= $chunk;
}

echo substr($response, 0, 200) . "\n";
socket_close($socket);
HTTP/1.1 200 OK Content-Type: text/html; ...

Einfacher TCP-Server-Socket

<?php
// Server-Socket erstellen
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if ($server === false) {
    die('Socket-Erstellung fehlgeschlagen: ' . socket_strerror(socket_last_error()));
}

// Adresse und Port binden
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, '127.0.0.1', 8080);
socket_listen($server, 5);

echo "Server lauscht auf 127.0.0.1:8080 ...\n";

// Eingehende Verbindung annehmen
$client = socket_accept($server);

if ($client !== false) {
    $message = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHallo Welt!";
    socket_write($client, $message, strlen($message));
    socket_close($client);
    echo "Verbindung bedient und geschlossen.\n";
}

socket_close($server);
Server lauscht auf 127.0.0.1:8080 ... Verbindung bedient und geschlossen.

UDP-Socket erstellen und Datagramm senden

<?php
// UDP-Socket für IPv4 erstellen
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

if ($socket === false) {
    die('Fehler: ' . socket_strerror(socket_last_error()));
}

$message = 'Ping';
$bytesSent = socket_sendto($socket, $message, strlen($message), 0, '127.0.0.1', 9999);

echo "Gesendete Bytes: $bytesSent\n";

socket_close($socket);
Gesendete Bytes: 4

// Wichtig · Fallstricke

Erweiterung erforderlich: Die Socket-Funktionen erfordern, dass PHP mit der sockets-Erweiterung kompiliert wurde (--enable-sockets). Auf einigen Systemen muss diese Erweiterung explizit aktiviert werden.

Raw Sockets: Die Verwendung von SOCK_RAW erfordert in der Regel Root-Rechte bzw. Administrator-Rechte. Ohne entsprechende Berechtigungen schlägt socket_create() fehl.

Ressource vs. Objekt: Ab PHP 8.0 gibt die Funktion ein Socket-Objekt zurück, in PHP 7.x und früher eine Ressource. Code, der auf den Typ prüft, muss entsprechend angepasst werden.

Fehlerbehandlung: Im Fehlerfall gibt die Funktion false zurück. Der genaue Fehler kann mit socket_last_error() und socket_strerror() ermittelt werden. Es empfiehlt sich immer, den Rückgabewert zu prüfen.