Función PHP getservbyport(): Todo lo que necesitas saber
Como desarrollador PHP, puedes necesitar obtener el nombre de servicio asociado a un número de puerto. La función PHP getservbyport() lo resuelve.
La función PHP getservbyport() convierte un puerto de red numérico en el nombre de servicio legible por humanos registrado para él — por ejemplo, el puerto 80 se convierte en http y el puerto 443 en https. Es la inversa de getservbyname(), que funciona en sentido contrario (nombre → puerto). Esta página explica la sintaxis, de dónde provienen los datos, los errores más comunes y cómo usar la función en código real.
Qué hace getservbyport()
getservbyport() busca el nombre de servicio conocido que un sistema operativo asocia a un par de puerto/protocolo dado. No abre un socket, no contacta a ningún servidor ni escanea nada — simplemente lee una tabla de búsqueda local mantenida por el sistema operativo:
- En Linux y macOS, la tabla es el archivo
/etc/services. - En Windows, es
%WINDIR%\System32\drivers\etc\services.
Dado que la respuesta proviene de un archivo estático, la función es rápida y funciona sin conexión, pero solo conoce los puertos que están listados en ese archivo. Un puerto de aplicación personalizada (por ejemplo, 8080 ejecutando tu servidor de desarrollo) normalmente devolverá false porque no hay ningún nombre de servicio registrado para él.
Sintaxis
getservbyport(int $port, string $protocol): string|falseParámetros
$port— el número de puerto a buscar, como un entero (por ejemplo80,443,22).$protocol— el nombre del protocolo, ya sea"tcp"o"udp". A diferencia de lo que sugieren algunas referencias, este argumento es obligatorio, no opcional. El mismo número de puerto puede corresponder a diferentes nombres de servicio dependiendo del protocolo.
Valor de retorno
- El nombre del servicio como string (por ejemplo
"http") cuando se encuentra una coincidencia. falsecuando el par puerto/protocolo no está registrado. Siempre comprueba el resultado con la comparación estricta=== false, ya que un nombre de servicio válido podría confundirse con un valor falsy.
Ejemplo básico
Aquí pedimos el servicio TCP en el puerto 80. En un sistema estándar, la búsqueda tiene éxito e imprime:
The service name for port number 80 and protocol name tcp is httpComo comparamos con === false, un puerto no registrado se reporta de forma clara en lugar de producir un mensaje confuso.
Buscar varios puertos
Cuando tienes una lista de puertos — por ejemplo, para etiquetar entradas en un registro de firewall — itera sobre ellos y resuelve cada uno:
<?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";
}Salida típica (el puerto 49152 está en el rango privado/dinámico y no es un servicio registrado, por lo que cae en la rama "unknown"):
Port 22/tcp: ssh
Port 25/tcp: smtp
Port 53/tcp: domain
Port 443/tcp: https
Port 49152/tcp: unknown serviceCuándo usarla (y cuándo no)
Usa getservbyport() cuando quieras una etiqueta amigable para un puerto conocido: renderizar archivos de registro, construir un panel de red o validar configuraciones. No es una forma de comprobar si un puerto está abierto o en uso — nunca toca la red. Para probar la conectividad necesitas una función de socket real como fsockopen().
Errores comunes
- Olvidar el argumento de protocolo.
getservbyport(80)genera un error; siempre pasa"tcp"o"udp". - Esperar que los puertos personalizados se resuelvan. Los puertos fuera de
/etc/servicesdevuelvenfalseincluso si un servidor está escuchando en ellos. - Comparación no estricta. Usa
=== false, no== falseni!$result, para que los casos límite con string vacío no se interpreten incorrectamente.
Funciones relacionadas
getservbyname()— la búsqueda inversa, nombre de servicio a número de puerto.getprotobyname()— resuelve un nombre de protocolo (como"tcp") a su número de protocolo.gethostbyname()— resuelve un nombre de host a una dirección IPv4.fsockopen()— abre una conexión de red real a un host y puerto.
Conclusión
getservbyport() es un pequeño pero útil helper que traduce un par puerto/protocolo a su nombre de servicio registrado leyendo el archivo de servicios del sistema. Recuerda que el argumento de protocolo es obligatorio, que los puertos desconocidos devuelven false y que la función realiza una búsqueda local en lugar de cualquier actividad de red. Combínala con getservbyname() para la dirección inversa y con fsockopen() cuando realmente necesites comunicarte con un servicio.