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|falseLa 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 :
Pour "tcp", cela affiche :
The protocol number for protocol name tcp is 6Notez 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 protocole | Numéro | Signification |
|---|---|---|
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 |
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 foundQuand 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 dur1fonctionne, maisgetprotobyname("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 (commehttp) 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.