Signatur
Beschreibung
socket_getpeername() liest die Adressinformationen des Gegenstücks (Peer) einer bestehenden Socket-Verbindung aus. Das Ergebnis wird in die per Referenz übergebenen Parameter $address und $port geschrieben. Die Funktion ist nützlich, um auf der Serverseite festzustellen, von welchem Client eine Verbindung stammt.
Bei IPv4-Sockets (AF_INET) wird die Adresse im gepunkteten Dezimalformat (z. B. 192.168.1.1) zurückgegeben, bei IPv6-Sockets (AF_INET6) im Hex-Format (z. B. ::1). Bei Unix-Domain-Sockets (AF_UNIX) enthält $address den Dateipfad, und $port wird auf 0 gesetzt.
Die Funktion ist besonders dann sinnvoll, wenn ein Server mehrere eingehende Verbindungen gleichzeitig verwaltet und die Herkunft einer Verbindung loggen oder prüfen möchte – etwa für IP-basiertes Rate-Limiting oder Zugriffskontrolle.
Im Fehlerfall gibt die Funktion false zurück; der genaue Fehlercode kann dann mit socket_last_error() abgerufen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $socket Pflicht | Socket | Ein gültiges Socket-Objekt, das zuvor mit socket_create() oder socket_accept() erzeugt wurde und bereits verbunden ist. |
|
| $address Pflicht | string | Wird per Referenz übergeben und enthält nach dem Aufruf die IP-Adresse (IPv4/IPv6) oder den Dateipfad (Unix-Domain-Socket) des Peers. | |
| $port | int | null | Wird per Referenz übergeben und enthält nach dem Aufruf den Port des Peers. Bei Unix-Domain-Sockets wird 0 gesetzt. Kann weggelassen werden, wenn der Port nicht benötigt wird. |
Rückgabewert
true zurück, wenn die Peer-Adresse erfolgreich ermittelt wurde, andernfalls false. Im Fehlerfall kann socket_last_error() für Details verwendet werden.Beispiele
Client-IP und Port eines eingehenden TCP-Clients ermitteln
<?php
// Einen einfachen TCP-Server aufsetzen
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
echo "Warte auf Verbindung...\n";
$client = socket_accept($server);
if ($client !== false) {
$address = '';
$port = 0;
if (socket_getpeername($client, $address, $port)) {
echo "Verbindung von: {$address}:{$port}\n";
} else {
$errorCode = socket_last_error($client);
echo "Fehler: " . socket_strerror($errorCode) . "\n";
}
socket_close($client);
}
socket_close($server);
IPv6-Peer-Adresse ermitteln
<?php
// IPv6 TCP-Server
$server = socket_create(AF_INET6, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($server, '::', 9090);
socket_listen($server);
$client = socket_accept($server);
if ($client !== false) {
$address = '';
$port = 0;
if (socket_getpeername($client, $address, $port)) {
echo "IPv6-Client verbunden: [{$address}]:{$port}\n";
}
socket_close($client);
}
socket_close($server);
// Wichtig · Fallstricke
Sicherheitshinweis: Die von socket_getpeername() zurückgelieferte IP-Adresse kann bei NAT oder Proxy-Infrastrukturen die eigentliche Herkunftsadresse des Endbenutzers verschleiern. Verlasse dich für Sicherheitsentscheidungen nicht ausschließlich auf diese Adresse.
Verfügbarkeit: Die Funktion setzt voraus, dass PHP mit Socket-Unterstützung kompiliert wurde (--enable-sockets) bzw. dass die sockets-Extension geladen ist. Ab PHP 8.0 wird statt einer Ressource ein Socket-Objekt verwendet.
Randfälle: Bei nicht verbundenen Sockets oder bei Sockets vom Typ SOCK_DGRAM, die noch keine Verbindung aufgebaut haben, schlägt der Aufruf fehl und gibt false zurück.