W3docs

Función PHP getprotobyname(): Todo lo que necesitas saber

Aprende a usar la función PHP getprotobyname() para obtener el número de protocolo asociado a un nombre de protocolo dado.

Cuando trabajas con redes de bajo nivel en PHP, a veces tienes un nombre de protocolo como tcp o udp pero necesitas su número de protocolo numérico — el valor asignado a ese protocolo por la IANA y usado dentro de las cabeceras de paquetes IP. La función getprotobyname() realiza exactamente esa búsqueda. Esta página cubre su sintaxis, valor de retorno, números de protocolo comunes, manejo de errores y cómo se relaciona con las demás funciones de búsqueda de protocolos/servicios en PHP.

¿Qué es la función getprotobyname()?

La función getprotobyname() es una función integrada de PHP que mapea un nombre de protocolo a su número correspondiente. Lee la base de datos de protocolos del sistema — normalmente /etc/protocols en sistemas tipo Unix y %SystemRoot%\System32\drivers\etc\protocol en Windows — por lo que los nombres que reconoce son los que aparecen listados allí (por ejemplo ip, icmp, tcp, udp, ipv6).

Es la inversa de getprotobynumber(), que convierte un número de vuelta en un nombre. Normalmente necesitas un número de protocolo sin procesar cuando abres un socket raw con socket_create() y APIs de bajo nivel similares, donde el protocolo debe especificarse numéricamente.

Sintaxis

getprotobyname(string $protocol): int|false

La función acepta un parámetro:

  • $protocol — el nombre del protocolo a buscar. La búsqueda no distingue entre mayúsculas y minúsculas, por lo que "TCP" y "tcp" devuelven el mismo resultado.

Devuelve un entero que representa el número de protocolo, o false si el nombre del protocolo no se encuentra en la base de datos del sistema.

Ejemplo básico

A continuación se muestra cómo buscar el número del protocolo tcp y manejar el caso en que la búsqueda falla:

php— editable, runs on the server

Para "tcp" esto imprime:

The protocol number for protocol name tcp is 6

Observa la comparación estricta === false. Dado que el número de protocolo válido más pequeño es 0 (el protocolo ip), una comprobación no estricta como if (!$protocol_number) trataría erróneamente una búsqueda exitosa de ip como un fallo. Compara siempre con false usando ===.

Números de protocolo comunes

Estos son los valores que verás con más frecuencia. Provienen directamente de la base de datos de protocolos del sistema, por lo que son estables en todas las plataformas:

Nombre del protocoloNúmeroSignificado
ip0Protocolo de Internet
icmp1Protocolo de mensajes de control de Internet
tcp6Protocolo de control de transmisión
udp17Protocolo de datagramas de usuario
ipv641Protocolo de Internet v6

Búsqueda de varios protocolos

Puedes iterar sobre una lista de nombres e informar cada resultado, tratando los nombres desconocidos de forma adecuada:

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

Esto produce:

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

¿Cuándo usaría esto?

En el desarrollo web cotidiano rara vez necesitas números de protocolo — fopen(), cURL y los envoltorios de flujos aceptan URLs, no números sin procesar. Recurrirás a getprotobyname() cuando bajes un nivel más:

  • Creación de sockets raw. socket_create(AF_INET, SOCK_RAW, getprotobyname("icmp")) escribe el número de protocolo en el socket. Codificar 1 directamente funciona, pero getprotobyname("icmp") documenta la intención y permanece correcto si la base de datos difiere.
  • Construcción o análisis de paquetes IP, donde el campo de protocolo es numérico.
  • Herramientas de red y diagnósticos que reportan tanto el nombre como el número de un protocolo.

Funciones relacionadas

  • getprotobynumber() — la búsqueda inversa: de número a nombre.
  • getservbyname() — mapea un nombre de servicio (como http) más un protocolo a un número de puerto.
  • getservbyport() — la inversa: de número de puerto a nombre de servicio.
  • fsockopen() — abre una conexión de red por host y puerto.

Conclusión

getprotobyname() resuelve un nombre de protocolo al número de protocolo numérico definido en la base de datos del sistema, devolviendo false cuando el nombre es desconocido. Recuerda probar el resultado con una comparación estricta === false para que el valor válido 0 del protocolo ip no se confunda con un error, y recurre a esta función siempre que una API de red de bajo nivel espere un protocolo numérico en lugar de un nombre.

Práctica

Práctica
¿Cuál es el propósito de la función getprotobyname en PHP, según la información proporcionada en https://www.w3docs.com/learn-php/getprotobyname.html?
¿Cuál es el propósito de la función getprotobyname en PHP, según la información proporcionada en https://www.w3docs.com/learn-php/getprotobyname.html?
Was this page helpful?