W3docs

Fonction PHP getprotobyname() : Tout ce que vous devez savoir

Découvrez la fonction PHP getprotobyname() pour obtenir le numéro de protocole associé à un nom de protocole donné.

Lorsque vous travaillez avec la mise en réseau de bas niveau en PHP, vous disposez parfois d'un nom de protocole tel que tcp ou udp, mais vous avez besoin de son numéro de protocole numérique — la valeur attribuée à ce protocole par l'IANA et utilisée dans les en-têtes de paquets IP. La fonction getprotobyname() effectue exactement cette recherche. Cette page couvre sa syntaxe, sa valeur de retour, les numéros de protocole courants, la gestion des erreurs, et sa relation avec les autres fonctions de recherche de protocole/service en PHP.

Qu'est-ce que la fonction getprotobyname() ?

La fonction getprotobyname() est une fonction PHP intégrée qui associe un nom de protocole à son numéro correspondant. Elle lit la base de données de protocoles du système — généralement /etc/protocols sur les systèmes de type Unix et %SystemRoot%\System32\drivers\etc\protocol sous Windows — donc les noms qu'elle reconnaît sont ceux qui y sont répertoriés (par exemple ip, icmp, tcp, udp, ipv6).

C'est l'inverse de getprotobynumber(), qui convertit un numéro en nom. Vous avez généralement besoin d'un numéro de protocole brut lorsque vous ouvrez un socket brut avec socket_create() et des API similaires de bas niveau, où le protocole doit être spécifié numériquement.

Syntaxe

getprotobyname(string $protocol): int|false

La fonction prend un paramètre :

  • $protocol — le nom du protocole à rechercher. La recherche est insensible à la casse, donc "TCP" et "tcp" renvoient le même résultat.

Elle retourne un entier représentant le numéro de protocole, ou false si le nom de protocole n'est pas trouvé dans la base de données système.

Exemple de base

Voici comment rechercher le numéro du protocole tcp et gérer le cas où la recherche échoue :

php— editable, runs on the server

Pour "tcp", cela affiche :

The protocol number for protocol name tcp is 6

Notez la comparaison stricte === false. Étant donné que le plus petit numéro de protocole valide est 0 (le protocole ip), une vérification souple comme if (!$protocol_number) traiterait à tort une recherche ip réussie comme un échec. Comparez toujours avec false en utilisant ===.

Numéros de protocole courants

Ce sont les valeurs que vous verrez le plus souvent. Elles proviennent directement de la base de données de protocoles système et sont donc stables sur toutes les plateformes :

Nom du protocoleNuméroSignification
ip0Internet Protocol
icmp1Internet Control Message Protocol
tcp6Transmission Control Protocol
udp17User Datagram Protocol
ipv641Internet Protocol v6

Recherche de plusieurs protocoles

Vous pouvez parcourir une liste de noms et afficher chaque résultat, en gérant correctement les noms inconnus :

<?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";
    }
}

Cela produit :

tcp => 6
udp => 17
icmp => 1
bogus: not found

Quand utiliser cette fonction ?

Dans le développement web quotidien, vous avez rarement besoin des numéros de protocole — fopen(), cURL et les wrappers de flux acceptent tous des URL, pas des numéros bruts. Vous avez recours à getprotobyname() lorsque vous descendez d'un niveau :

  • Création de sockets bruts. socket_create(AF_INET, SOCK_RAW, getprotobyname("icmp")) inscrit le numéro de protocole dans le socket. Coder en dur 1 fonctionne, mais getprotobyname("icmp") documente l'intention et reste correct si la base de données diffère.
  • Construction ou analyse de paquets IP, où le champ de protocole est numérique.
  • Outils réseau et diagnostics qui rapportent à la fois le nom et le numéro d'un protocole.

Fonctions associées

  • getprotobynumber() — la recherche inverse : numéro vers nom.
  • getservbyname() — associe un nom de service (comme http) ainsi qu'un protocole à un numéro de port.
  • getservbyport() — l'inverse : numéro de port vers nom de service.
  • fsockopen() — ouvre une connexion réseau par hôte et port.

Conclusion

getprotobyname() résout un nom de protocole en numéro de protocole numérique défini dans la base de données système, et retourne false lorsque le nom est inconnu. N'oubliez pas de tester le résultat avec une comparaison stricte === false afin que la valeur valide 0 du protocole ip ne soit pas confondue avec une erreur, et faites appel à cette fonction chaque fois qu'une API de mise en réseau de bas niveau attend un protocole numérique plutôt qu'un nom.

Pratique

Pratique
Quel est le rôle de la fonction getprotobyname en PHP, selon les informations fournies sur https://www.w3docs.com/learn-php/getprotobyname.html ?
Quel est le rôle de la fonction getprotobyname en PHP, selon les informations fournies sur https://www.w3docs.com/learn-php/getprotobyname.html ?
Was this page helpful?