Start · Sprachen · PHP · Referenz · socket_getpeername

socket_getpeername

Funktion

Ermittelt die IP-Adresse und den Port des entfernten Endpunkts einer Socket-Verbindung.

seit PHP 4.1.0 Kategorie: http

Signatur

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

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

Typ
bool
Beschreibung
Gibt 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);
Warte auf Verbindung... Verbindung von: 127.0.0.1:54321

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);
IPv6-Client verbunden: [::1]:49152

// 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.