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