Signatur
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
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 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);
// 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).