Start · Sprachen · PHP · Referenz · socket_connect

socket_connect

Funktion

Baut eine Verbindung zu einem entfernten Host über einen zuvor erstellten <code>Socket</code> auf.

seit PHP 4.1.0 Kategorie: http

Signatur

socket_connect(Socket $socket, string $address, ?int $port = null): bool

Beschreibung

socket_connect() stellt eine Verbindung zu einer Zieladresse her, die durch $address und optional $port definiert wird. Der Socket muss zuvor mit socket_create() erzeugt worden sein und darf noch nicht verbunden sein. Die Funktion wird typischerweise für die Client-Seite einer Socket-Kommunikation verwendet, während Server-Sockets stattdessen socket_bind() und socket_listen() nutzen.

Für TCP-Verbindungen (AF_INET oder AF_INET6 mit SOCK_STREAM) muss $port angegeben werden. Bei Unix-Domain-Sockets (AF_UNIX) enthält $address den Pfad zur Socket-Datei, und $port wird ignoriert bzw. sollte weggelassen werden.

Im Fehlerfall gibt die Funktion false zurück. Den genauen Fehlercode kann man anschließend mit socket_last_error() abfragen und mit socket_strerror() in eine lesbare Meldung umwandeln. Typische Fehlerursachen sind ein nicht erreichbarer Host, ein geschlossener Port oder ein falsches Protokoll.

Für einfachere HTTP- oder allgemeine Netzwerkkommunikation empfehlen sich oft höherstufige Alternativen wie fsockopen(), Streams oder Bibliotheken wie cURL. socket_connect() ist hingegen sinnvoll, wenn volle Kontrolle über die Socket-Optionen (z. B. Timeouts, Keep-Alive, nicht-blockierender Modus) benötigt wird.

Parameter

Name Typ Default Beschreibung
$socket Pflicht Socket Eine gültige Socket-Instanz, die zuvor mit socket_create() erzeugt wurde.
$address Pflicht string Die IPv4-Adresse (z. B. '192.168.1.1'), IPv6-Adresse oder der Hostname des Ziel-Hosts. Bei AF_UNIX-Sockets der Dateisystempfad zur Socket-Datei.
$port ?int null Der Ziel-Port für AF_INET- und AF_INET6-Sockets (z. B. 80 für HTTP). Bei AF_UNIX-Sockets nicht erforderlich.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei erfolgreicher Verbindung zurück, false im Fehlerfall. Den letzten Fehlercode liefert socket_last_error().

Beispiele

Einfache HTTP-Anfrage über einen TCP-Socket

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

$result = socket_connect($socket, 'example.com', 80);
if ($result === false) {
    die('socket_connect() fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}

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

$response = '';
while ($chunk = socket_read($socket, 1024)) {
    $response .= $chunk;
}

socket_close($socket);
echo substr($response, 0, 200); // Erste 200 Zeichen der Antwort ausgeben
HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 ...

Verbindung über einen Unix-Domain-Socket

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

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

if (!socket_connect($socket, $socketPath)) {
    $errorCode = socket_last_error($socket);
    die('Verbindung zu Unix-Socket fehlgeschlagen: ' . socket_strerror($errorCode));
}

$message = "Hello, Unix Socket!\n";
socket_write($socket, $message, strlen($message));

$response = socket_read($socket, 2048);
echo 'Antwort: ' . $response;

socket_close($socket);
Antwort: Hello, Unix Socket!

Nicht-blockierender Socket mit Verbindungs-Timeout

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die('socket_create() fehlgeschlagen.');
}

// Timeout für Sende- und Empfangsoperationen setzen
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => 5, 'usec' => 0]);

$connected = socket_connect($socket, '93.184.216.34', 80); // IP von example.com
if (!$connected) {
    echo 'Fehler: ' . socket_strerror(socket_last_error($socket)) . PHP_EOL;
} else {
    echo 'Verbindung erfolgreich hergestellt.' . PHP_EOL;
}

socket_close($socket);
Verbindung erfolgreich hergestellt.

// Wichtig · Fallstricke

Sicherheitshinweis: Wenn die Zieladresse aus Benutzereingaben stammt, muss diese unbedingt validiert und bereinigt werden, um Server-Side Request Forgery (SSRF) zu verhindern. Ein Angreifer könnte sonst interne Netzwerkressourcen ansprechen.

Nicht-blockierender Modus: Bei mit socket_set_nonblock() in den nicht-blockierenden Modus versetzten Sockets gibt socket_connect() sofort false zurück und setzt den Fehlercode auf EINPROGRESS (115). In diesem Fall muss mit socket_select() auf den Abschluss des Verbindungsaufbaus gewartet werden.

PHP-Version: Seit PHP 8.0 wird anstelle des alten resource-Typs das Socket-Objekt verwendet. Code, der false-Checks mit === false nutzt, bleibt jedoch weiterhin kompatibel.

Portangabe bei AF_INET: Wird bei einem TCP/UDP-Socket der $port-Parameter weggelassen oder auf null gesetzt, schlägt die Verbindung fehl. Der Port ist für diese Adressfamilien zwingend erforderlich.