PHP getservbyport() Funktion: Alles, was Sie wissen müssen
Als PHP-Entwickler müssen Sie möglicherweise den Dienstnamen für eine bestimmte Portnummer ermitteln. Die PHP-Funktion getservbyport() hilft dabei.
Die PHP-Funktion getservbyport() wandelt eine numerische Netzwerkportnummer in den menschenlesbaren Dienstnamen um, der dafür registriert ist — zum Beispiel wird Port 80 zu http und Port 443 zu https. Sie ist die Umkehrung von getservbyname(), die den umgekehrten Weg geht (Name → Port). Diese Seite erklärt die Syntax, woher die Daten stammen, häufige Fallstricke und wie die Funktion im echten Code verwendet wird.
Was getservbyport() macht
getservbyport() sucht den bekannten Dienstnamen heraus, den ein Betriebssystem einem bestimmten Port/Protokoll-Paar zuordnet. Es wird kein Socket geöffnet, kein Server kontaktiert und nichts gescannt — die Funktion liest lediglich eine lokale Nachschlagetabelle, die vom Betriebssystem gepflegt wird:
- Unter Linux und macOS ist die Tabelle die Datei
/etc/services. - Unter Windows ist es
%WINDIR%\System32\drivers\etc\services.
Da die Antwort aus einer statischen Datei stammt, ist die Funktion schnell und funktioniert offline. Sie kennt jedoch nur Ports, die in dieser Datei aufgeführt sind. Ein benutzerdefinierter Anwendungsport (etwa 8080 für Ihren Entwicklungsserver) gibt in der Regel false zurück, weil kein Dienstname dafür registriert ist.
Syntax
getservbyport(int $port, string $protocol): string|falseParameter
$port— die nachzuschlagende Portnummer als Integer (zum Beispiel80,443,22).$protocol— der Protokollname, entweder"tcp"oder"udp". Im Gegensatz zu manchen Quellen ist dieses Argument erforderlich, nicht optional. Dieselbe Portnummer kann je nach Protokoll auf unterschiedliche Dienstnamen verweisen.
Rückgabewert
- Den Dienstnamen als string (zum Beispiel
"http"), wenn eine Übereinstimmung gefunden wird. false, wenn das Port/Protokoll-Paar nicht registriert ist. Testen Sie das Ergebnis immer mit dem strikten=== false-Vergleich, da ein gültiger Dienstname sonst fälschlicherweise als falscher Wert interpretiert werden könnte.
Einfaches Beispiel
Hier fragen wir nach dem TCP-Dienst auf Port 80. Auf einem Standardsystem ist die Suche erfolgreich und gibt aus:
The service name for port number 80 and protocol name tcp is httpDa wir mit === false vergleichen, wird ein nicht registrierter Port klar gemeldet, anstatt eine verwirrende Ausgabe zu erzeugen.
Mehrere Ports nachschlagen
Wenn Sie eine Liste von Ports haben — zum Beispiel um Einträge in einem Firewall-Protokoll zu beschriften — iterieren Sie darüber und lösen Sie jeden einzeln auf:
<?php
$ports = [22, 25, 53, 443, 49152];
foreach ($ports as $port) {
$service = getservbyport($port, "tcp");
echo $service === false
? "Port $port/tcp: unknown service\n"
: "Port $port/tcp: $service\n";
}Typische Ausgabe (Port 49152 liegt im privaten/dynamischen Bereich und ist kein registrierter Dienst, daher fällt er in den „unbekannt"-Zweig):
Port 22/tcp: ssh
Port 25/tcp: smtp
Port 53/tcp: domain
Port 443/tcp: https
Port 49152/tcp: unknown serviceWann verwenden (und wann nicht)
Verwenden Sie getservbyport(), wenn Sie eine benutzerfreundliche Bezeichnung für einen bekannten Port benötigen: beim Darstellen von Protokolldateien, beim Erstellen eines Netzwerk-Dashboards oder beim Validieren von Konfigurationen. Es ist keine Methode, um zu prüfen, ob ein Port offen oder in Verwendung ist — die Funktion berührt das Netzwerk nie. Um die Verbindung zu testen, benötigen Sie eine echte Socket-Funktion wie fsockopen().
Häufige Fallstricke
- Das Protokollargument vergessen.
getservbyport(80)erzeugt einen Fehler; übergeben Sie immer"tcp"oder"udp". - Erwarten, dass benutzerdefinierte Ports aufgelöst werden. Ports, die nicht in
/etc/serviceseingetragen sind, gebenfalsezurück, auch wenn ein Server auf ihnen lauscht. - Loser Vergleich. Verwenden Sie
=== false, nicht== falseoder!$result, damit Edge-Cases mit leerem string nicht falsch interpretiert werden.
Verwandte Funktionen
getservbyname()— die umgekehrte Suche, Dienstname zu Portnummer.getprotobyname()— löst einen Protokollnamen (wie"tcp") in seine Protokollnummer auf.gethostbyname()— löst einen Hostnamen in eine IPv4-Adresse auf.fsockopen()— öffnet eine echte Netzwerkverbindung zu einem Host und Port.
Fazit
getservbyport() ist ein kleiner, aber praktischer Helfer, der ein Port/Protokoll-Paar in den registrierten Dienstnamen übersetzt, indem er die Services-Datei des Systems liest. Denken Sie daran, dass das Protokollargument obligatorisch ist, dass unbekannte Ports false zurückgeben und dass die Funktion eine lokale Suche durchführt und keinerlei Netzwerkaktivität entfaltet. Kombinieren Sie sie mit getservbyname() für die umgekehrte Richtung und mit fsockopen(), wenn Sie tatsächlich mit einem Dienst kommunizieren müssen.