W3docs

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

Parámetros

  • $port — el número de puerto a buscar, como un entero (por ejemplo 80, 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.
  • false cuando 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

php— editable, runs on the server

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 http

Como 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 service

Cuá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/services devuelven false incluso si un servidor está escuchando en ellos.
  • Comparación no estricta. Usa === false, no == false ni !$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.

Práctica

Práctica
¿Qué hace la función getservbyport() en PHP?
¿Qué hace la función getservbyport() en PHP?
Was this page helpful?