Start · Sprachen · PHP · Referenz · getservbyname

getservbyname

Funktion

Liefert die Portnummer, die einem Internet-Dienst und einem Protokoll (<code>tcp</code> oder <code>udp</code>) zugeordnet ist.

seit PHP 4.0.0 Kategorie: http

Signatur

getservbyname(string $service, string $protocol): int|false

Beschreibung

getservbyname() liest die systemweite Dienste-Datenbank (unter Unix typischerweise /etc/services, unter Windows die entsprechende Systemdatei) und gibt die Port-Nummer zurück, die dem angegebenen Dienstnamen und Protokoll zugeordnet ist. Damit lassen sich hartcodierte Port-Nummern im Quellcode vermeiden und die tatsächlichen Systemkonfigurationen nutzen.

Typische Anwendungsfälle sind Netzwerk-Clients und -Server, die einen Dienst über seinen Namen ansprechen wollen, ohne die Port-Nummer zu kennen – etwa http (80), https (443), ftp (21) oder smtp (25). So bleibt der Code lesbarer und portabler.

Die Funktion ist das Gegenstück zu getservbyport(), die ausgehend von Port-Nummer und Protokoll den Dienstnamen liefert. Beide Funktionen sind Teil der POSIX-Netzwerk-API, die PHP über seine Netzwerkfunktionen bereitstellt.

Parameter

Name Typ Default Beschreibung
$service Pflicht string Name des Internet-Dienstes, z. B. http, ftp, smtp oder ssh. Die Groß-/Kleinschreibung ist systemabhängig; üblicherweise wird Kleinschreibung erwartet.
$protocol Pflicht string Name des Transportprotokolls: entweder tcp oder udp. Andere Werte führen in der Regel dazu, dass false zurückgegeben wird.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Port-Nummer als int zurück, wenn der Dienst gefunden wurde. Ist der Dienst oder das Protokoll unbekannt, wird false zurückgegeben.

Beispiele

Port-Nummern bekannter Dienste ermitteln

<?php
$dienste = ['http', 'https', 'ftp', 'smtp', 'ssh', 'dns'];
$protokolle = ['tcp', 'udp'];

foreach ($dienste as $dienst) {
    foreach ($protokolle as $proto) {
        $port = getservbyname($dienst, $proto);
        if ($port !== false) {
            echo sprintf("%-8s %-4s => Port %d\n", $dienst, $proto, $port);
        }
    }
}
http tcp => Port 80 http udp => Port 80 https tcp => Port 443 https udp => Port 443 ftp tcp => Port 21 smtp tcp => Port 25 ssh tcp => Port 22 dns tcp => Port 53 dns udp => Port 53

Socket-Verbindung mit dynamisch ermitteltem Port

<?php
$host    = 'example.com';
$dienst  = 'http';
$port    = getservbyname($dienst, 'tcp');

if ($port === false) {
    echo "Dienst '$dienst' nicht gefunden.\n";
    exit(1);
}

echo "Verbinde mit $host auf Port $port ...\n";

$socket = @fsockopen($host, $port, $errno, $errstr, 5);
if ($socket) {
    echo "Verbindung erfolgreich hergestellt.\n";
    fclose($socket);
} else {
    echo "Verbindung fehlgeschlagen: $errstr ($errno)\n";
}
Verbinde mit example.com auf Port 80 ... Verbindung erfolgreich hergestellt.

// Wichtig · Fallstricke

Plattformunterschiede: Auf Windows-Systemen wird nicht /etc/services gelesen, sondern die interne Windows-Dienstedatenbank. Das Ergebnis kann daher zwischen Betriebssystemen leicht abweichen, insbesondere bei weniger verbreiteten Diensten.

Rückgabe prüfen: Da false als Fehlerindikator zurückgegeben wird, sollte der Vergleich immer mit !== false (Typvergleich) erfolgen, da Port 0 theoretisch eine gültige, aber unwahrscheinliche Rückgabe wäre.

Nicht für benutzerdefinierte Ports: Die Funktion eignet sich nur für Standarddienste, die in der Systemdatenbank eingetragen sind. Eigene oder nicht standardisierte Ports müssen weiterhin hartcodiert oder konfigurierbar gehalten werden.