W3docs

Fonction PHP getservbyport() : tout ce que vous devez savoir

En PHP, la fonction getservbyport() permet d'obtenir le nom de service associé à un numéro de port donné. Découvrez sa syntaxe et son utilisation.

La fonction PHP getservbyport() convertit un numéro de port réseau en nom de service lisible par l'homme — par exemple, le port 80 devient http et le port 443 devient https. C'est l'inverse de getservbyname(), qui fait le chemin inverse (nom → port). Cette page explique la syntaxe, l'origine des données, les pièges courants et comment utiliser cette fonction dans du code réel.

Ce que fait getservbyport()

getservbyport() recherche le nom de service bien connu qu'un système d'exploitation associe à une paire port/protocole donnée. Elle n'ouvre pas de socket, ne contacte pas de serveur et ne scanne rien — elle lit simplement une table de correspondance locale maintenue par l'OS :

  • Sur Linux et macOS, la table est le fichier /etc/services.
  • Sur Windows, il s'agit de %WINDIR%\System32\drivers\etc\services.

La réponse provenant d'un fichier statique, la fonction est rapide et fonctionne hors ligne, mais elle ne connaît que les ports répertoriés dans ce fichier. Un port d'application personnalisé (par exemple 8080 utilisé par votre serveur de développement) retournera généralement false, car aucun nom de service n'y est enregistré.

Syntaxe

getservbyport(int $port, string $protocol): string|false

Paramètres

  • $port — le numéro de port à rechercher, sous forme d'entier (par exemple 80, 443, 22).
  • $protocol — le nom du protocole, soit "tcp" soit "udp". Contrairement à ce que suggèrent certaines références, cet argument est obligatoire, et non optionnel. Un même numéro de port peut correspondre à des noms de service différents selon le protocole.

Valeur de retour

  • Le nom du service sous forme de chaîne (par exemple "http") lorsqu'une correspondance est trouvée.
  • false lorsque la paire port/protocole n'est pas enregistrée. Testez toujours le résultat avec la comparaison stricte === false, car un nom de service valide pourrait sinon être confondu avec une valeur équivalente à faux.

Exemple de base

php— editable, runs on the server

Ici, nous demandons le service TCP sur le port 80. Sur un système standard, la recherche réussit et affiche :

The service name for port number 80 and protocol name tcp is http

En comparant avec === false, un port non enregistré est signalé clairement au lieu de produire un message confus.

Recherche de plusieurs ports

Lorsque vous disposez d'une liste de ports — par exemple pour étiqueter des entrées dans un journal de pare-feu — parcourez-les en boucle et résolvez chacun d'eux :

<?php

$ports = [22, 25, 53, 443, 49152];

foreach ($ports as $port) {
  $service = getservbyport($port, "tcp");
  echo $service === false
    ? "Port $port/tcp: unknown service\n"
    : "Port $port/tcp: $service\n";
}

Sortie typique (le port 49152 se trouve dans la plage privée/dynamique et n'est pas un service enregistré, il passe donc dans la branche "inconnu") :

Port 22/tcp: ssh
Port 25/tcp: smtp
Port 53/tcp: domain
Port 443/tcp: https
Port 49152/tcp: unknown service

Quand l'utiliser (et quand ne pas l'utiliser)

Utilisez getservbyport() lorsque vous souhaitez un libellé convivial pour un port connu : affichage de fichiers journaux, construction d'un tableau de bord réseau ou validation de configuration. Ce n'est pas un moyen de vérifier si un port est ouvert ou utilisé — cette fonction ne touche jamais au réseau. Pour tester la connectivité, vous avez besoin d'une véritable fonction socket comme fsockopen().

Pièges courants

  • Oublier l'argument protocole. getservbyport(80) génère une erreur ; passez toujours "tcp" ou "udp".
  • S'attendre à ce que les ports personnalisés se résolvent. Les ports absents de /etc/services retournent false, même si un serveur les écoute.
  • Comparaison lâche. Utilisez === false, et non == false ou !$result, afin que les cas limites avec une chaîne vide ne soient pas mal interprétés.

Fonctions associées

  • getservbyname() — la recherche inverse, du nom de service vers le numéro de port.
  • getprotobyname() — résoudre un nom de protocole (comme "tcp") en son numéro de protocole.
  • gethostbyname() — résoudre un nom d'hôte en adresse IPv4.
  • fsockopen() — ouvrir une connexion réseau réelle vers un hôte et un port.

Conclusion

getservbyport() est un petit utilitaire pratique qui traduit une paire port/protocole en son nom de service enregistré en lisant le fichier de services du système. N'oubliez pas que l'argument protocole est obligatoire, que les ports inconnus retournent false et que la fonction effectue une recherche locale sans aucune activité réseau. Associez-la à getservbyname() pour la direction inverse et à fsockopen() lorsque vous avez réellement besoin de communiquer avec un service.

Pratique

Pratique
Que fait la fonction getservbyport() en PHP ?
Que fait la fonction getservbyport() en PHP ?
Was this page helpful?