Start · Sprachen · PHP · Referenz · socket_getsockname

socket_getsockname

Funktion

Fragt die lokale Adresse und den Port (TCP/UDP) bzw. den Dateisystempfad (Unix-Domain-Sockets) des übergebenen Sockets ab.

seit PHP 4.1.0 Kategorie: http

Signatur

socket_getsockname(Socket $socket, string &$address, int &$port = null): bool

Beschreibung

socket_getsockname() ermittelt die lokale Bindungsadresse eines Sockets. Bei TCP- oder UDP-Sockets wird die IP-Adresse als String in $address und der Port als Integer in $port geschrieben. Bei Unix-Domain-Sockets enthält $address den Dateisystempfad, während $port ignoriert wird.

Die Funktion ist besonders nützlich, wenn ein Socket mit Port 0 gebunden wurde und das Betriebssystem automatisch einen freien Port zugewiesen hat – mit socket_getsockname() kann der tatsächlich zugewiesene Port nachträglich ermittelt werden.

Im Gegensatz zu socket_getpeername(), die die entfernte Gegenstelle eines verbundenen Sockets zurückgibt, liefert socket_getsockname() stets die lokale Seite der Socket-Verbindung. Der Socket muss zuvor mit socket_bind() gebunden worden sein.

Im Fehlerfall gibt die Funktion false zurück; der Fehlercode kann dann mit socket_last_error() abgefragt werden.

Parameter

Name Typ Default Beschreibung
$socket Pflicht Socket Eine gültige Socket-Ressource, die zuvor mit socket_create() erzeugt und mit socket_bind() gebunden wurde.
$address Pflicht string Referenz-Variable, in die die lokale IP-Adresse (z. B. '127.0.0.1' oder '::') bzw. der Unix-Socket-Pfad (z. B. '/tmp/my.sock') geschrieben wird.
$port int null Optionale Referenz-Variable, in die der lokale Port geschrieben wird. Bei Unix-Domain-Sockets (AF_UNIX) wird dieser Parameter ignoriert.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Abfrage erfolgreich war, andernfalls false. Im Fehlerfall kann der genaue Fehlercode mit socket_last_error() und die Fehlermeldung mit socket_strerror() abgerufen werden.

Beispiele

Automatisch zugewiesenen Port nach Bindung an Port 0 ermitteln

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

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

socket_getsockname($socket, $address, $port);
echo "Lokale Adresse: {$address}\n";
echo "Zugewiesener Port: {$port}\n";

socket_close($socket);
Lokale Adresse: 127.0.0.1 Zugewiesener Port: 54321

Lokale Adresse eines Unix-Domain-Sockets abfragen

<?php
$sockPath = '/tmp/example.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) === false) {
    die('socket_bind() fehlgeschlagen: ' . socket_strerror(socket_last_error($socket)));
}

socket_getsockname($socket, $address);
echo "Unix-Socket-Pfad: {$address}\n";

socket_close($socket);
unlink($sockPath);
Unix-Socket-Pfad: /tmp/example.sock

// Wichtig · Fallstricke

Achtung: Der Socket muss zuvor erfolgreich mit socket_bind() gebunden worden sein, da socket_getsockname() sonst keine sinnvollen Werte zurückliefert und ggf. false zurückgibt.

Ab PHP 8.0 wird statt einer Ressource eine Socket-Objekt-Instanz erwartet. Älterer Code, der resource-Typen verwendet, muss ggf. angepasst werden.

Bei IPv6-Adressen enthält $address die Adresse ohne eckige Klammern, z. B. '::1'. Dies ist zu beachten, wenn die Adresse in einer URL weiterverwendet werden soll (dort wäre [::1] erforderlich).