W3docs

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|false

Die 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:

php— editable, runs on the server

Für "tcp" wird ausgegeben:

The protocol number for protocol name tcp is 6

Beachten 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:

ProtokollnameNummerBedeutung
ip0Internet Protocol
icmp1Internet Control Message Protocol
tcp6Transmission Control Protocol
udp17User Datagram Protocol
ipv641Internet 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 found

Wann 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 Zahl 1 fest zu kodieren funktioniert, aber getprotobyname("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.

Übungen

Übung
Was ist der Zweck der getprotobyname-Funktion in PHP, gemäß den Informationen auf https://www.w3docs.com/learn-php/getprotobyname.html?
Was ist der Zweck der getprotobyname-Funktion in PHP, gemäß den Informationen auf https://www.w3docs.com/learn-php/getprotobyname.html?
Was this page helpful?