PHP getprotobyname() Funktion: Alles, was Sie wissen müssen
Erfahren Sie, wie die PHP-Funktion getprotobyname() einen Protokollnamen in die zugehörige Protokollnummer umwandelt – mit Beispielen und Hinweisen.
Wenn Sie in PHP mit Low-Level-Netzwerken arbeiten, haben Sie manchmal einen Protokoll-namen wie tcp oder udp, benötigen aber dessen numerische Protokollnummer — den Wert, den die IANA diesem Protokoll zugewiesen hat und der in IP-Paket-Headern verwendet wird. Die Funktion getprotobyname() führt genau diese Suche durch. Diese Seite beschreibt Syntax, Rückgabewert, häufige Protokollnummern, Fehlerbehandlung und das Verhältnis zu anderen Protokoll-/Dienst-Suchfunktionen in PHP.
Was ist die getprotobyname() Funktion?
Die Funktion getprotobyname() ist eine eingebaute PHP-Funktion, die einen Protokoll-namen auf die zugehörige Nummer abbildet. Sie liest die Protokolldatenbank des Systems — üblicherweise /etc/protocols auf Unix-ähnlichen Systemen und %SystemRoot%\System32\drivers\etc\protocol unter Windows — daher versteht sie nur die dort aufgeführten Namen (z. B. ip, icmp, tcp, udp, ipv6).
Sie ist das Gegenstück zu getprotobynumber(), das eine Nummer zurück in einen Namen umwandelt. Eine rohe Protokollnummer benötigen Sie typischerweise beim Öffnen eines Raw Sockets mit socket_create() und ähnlichen Low-Level-APIs, bei denen das Protokoll numerisch angegeben werden muss.
Syntax
getprotobyname(string $protocol): int|falseDie Funktion nimmt einen Parameter:
$protocol— der nachzuschlagende Protokollname. Die Suche ist nicht case-sensitiv, daher liefern"TCP"und"tcp"dasselbe Ergebnis.
Sie gibt eine Ganzzahl zurück, die die Protokollnummer repräsentiert, oder false, wenn der Protokollname in der Systemdatenbank nicht gefunden wird.
Einfaches Beispiel
So schlagen Sie die Nummer für das Protokoll tcp nach und behandeln den Fall, dass die Suche fehlschlägt:
Für "tcp" wird ausgegeben:
The protocol number for protocol name tcp is 6Beachten Sie den strikten Vergleich === false. Da die kleinste gültige Protokollnummer 0 ist (das Protokoll ip), würde eine lose Prüfung wie if (!$protocol_number) eine erfolgreiche ip-Suche fälschlicherweise als Fehler behandeln. Vergleichen Sie daher immer mit === false.
Häufige Protokollnummern
Dies sind die Werte, die am häufigsten vorkommen. Sie stammen direkt aus der Systemprotokoll-Datenbank und sind daher plattformübergreifend stabil:
| Protokollname | Nummer | Bedeutung |
|---|---|---|
ip | 0 | Internet Protocol |
icmp | 1 | Internet Control Message Protocol |
tcp | 6 | Transmission Control Protocol |
udp | 17 | User Datagram Protocol |
ipv6 | 41 | Internet Protocol v6 |
Mehrere Protokolle nachschlagen
Sie können eine Liste von Namen durchlaufen und jedes Ergebnis ausgeben, wobei unbekannte Namen korrekt behandelt werden:
<?php
$protocols = ["tcp", "udp", "icmp", "bogus"];
foreach ($protocols as $name) {
$number = getprotobyname($name);
if ($number === false) {
echo "$name: not found\n";
} else {
echo "$name => $number\n";
}
}Die Ausgabe lautet:
tcp => 6
udp => 17
icmp => 1
bogus: not foundWann verwende ich diese Funktion?
Im alltäglichen Web-Development benötigt man selten Protokollnummern — fopen(), cURL und Stream-Wrapper nehmen alle URLs, keine rohen Nummern. getprotobyname() kommt zum Einsatz, wenn Sie eine Ebene tiefer gehen:
- Erstellen von Raw Sockets.
socket_create(AF_INET, SOCK_RAW, getprotobyname("icmp"))schreibt die Protokollnummer in den Socket. Die Zahl1fest zu kodieren funktioniert, abergetprotobyname("icmp")dokumentiert die Absicht und bleibt korrekt, falls die Datenbank abweicht. - Aufbau oder Analyse von IP-Paketen, bei denen das Protokollfeld numerisch ist.
- Netzwerk-Tools und Diagnose, die sowohl Namen als auch Nummer eines Protokolls ausgeben.
Verwandte Funktionen
getprotobynumber()— die umgekehrte Suche: Nummer zu Name.getservbyname()— ordnet einen Dienst-Namen (z. B.http) zusammen mit einem Protokoll einer Portnummer zu.getservbyport()— die Umkehrung: Portnummer zu Dienstname.fsockopen()— öffnet eine Netzwerkverbindung über Host und Port.
Fazit
getprotobyname() löst einen Protokollnamen in die numerische Protokollnummer auf, die in der Systemdatenbank definiert ist, und gibt false zurück, wenn der Name unbekannt ist. Denken Sie daran, das Ergebnis mit einem strikten === false-Vergleich zu prüfen, damit der gültige ip-Wert 0 nicht fälschlicherweise als Fehler erkannt wird, und greifen Sie auf diese Funktion zurück, wenn eine Low-Level-Netzwerk-API eine numerische Protokollangabe erwartet.