W3docs

Função PHP getprotobyname(): Tudo o Que Você Precisa Saber

Saiba como usar a função PHP getprotobyname() para obter o número de protocolo associado a um nome de protocolo de rede.

Ao trabalhar com redes de baixo nível em PHP, às vezes você tem um nome de protocolo como tcp ou udp, mas precisa do seu número de protocolo numérico — o valor atribuído a esse protocolo pela IANA e usado dentro dos cabeçalhos de pacotes IP. A função getprotobyname() realiza exatamente essa consulta. Esta página abrange sua sintaxe, valor de retorno, números de protocolo comuns, tratamento de erros e como ela se relaciona com as demais funções de consulta de protocolo/serviço em PHP.

O que é a Função getprotobyname()?

A função getprotobyname() é uma função PHP integrada que mapeia um nome de protocolo para o seu número correspondente. Ela lê o banco de dados de protocolos do sistema — geralmente /etc/protocols em sistemas Unix e %SystemRoot%\System32\drivers\etc\protocol no Windows — portanto, os nomes que ela reconhece são os listados lá (por exemplo, ip, icmp, tcp, udp, ipv6).

É o inverso de getprotobynumber(), que converte um número de volta em um nome. Você geralmente precisa de um número de protocolo bruto ao abrir um raw socket com socket_create() e APIs semelhantes de baixo nível, onde o protocolo deve ser especificado numericamente.

Sintaxe

getprotobyname(string $protocol): int|false

A função aceita um parâmetro:

  • $protocol — o nome do protocolo a ser consultado. A consulta não diferencia maiúsculas de minúsculas, portanto "TCP" e "tcp" retornam o mesmo resultado.

Ela retorna um inteiro representando o número do protocolo, ou false se o nome do protocolo não for encontrado no banco de dados do sistema.

Exemplo básico

Veja como consultar o número do protocolo tcp e tratar o caso em que a consulta falha:

php— editable, runs on the server

Para "tcp", isso imprime:

The protocol number for protocol name tcp is 6

Observe a comparação estrita === false. Como o menor número de protocolo válido é 0 (o protocolo ip), uma verificação solta como if (!$protocol_number) trataria erroneamente uma consulta bem-sucedida de ip como falha. Sempre compare com false usando ===.

Números de protocolo comuns

Estes são os valores que você encontrará com mais frequência. Eles vêm diretamente do banco de dados de protocolos do sistema, portanto são estáveis entre plataformas:

Nome do protocoloNúmeroSignificado
ip0Internet Protocol
icmp1Internet Control Message Protocol
tcp6Transmission Control Protocol
udp17User Datagram Protocol
ipv641Internet Protocol v6

Consultando vários protocolos

Você pode iterar sobre uma lista de nomes e reportar cada resultado, tratando nomes desconhecidos de forma adequada:

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

Isso produz:

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

Quando usar esta função?

No desenvolvimento web do dia a dia, raramente você precisa de números de protocolo — fopen(), cURL e wrappers de stream aceitam URLs, não números brutos. Você recorre a getprotobyname() quando desce um nível:

  • Criando raw sockets. socket_create(AF_INET, SOCK_RAW, getprotobyname("icmp")) grava o número do protocolo no socket. Usar 1 diretamente funciona, mas getprotobyname("icmp") documenta a intenção e permanece correto mesmo que o banco de dados difira.
  • Construindo ou analisando pacotes IP, onde o campo de protocolo é numérico.
  • Ferramentas de rede e diagnósticos que reportam tanto o nome quanto o número de um protocolo.

Funções relacionadas

  • getprotobynumber() — a consulta inversa: número para nome.
  • getservbyname() — mapeia um nome de serviço (como http) mais um protocolo para um número de porta.
  • getservbyport() — o inverso: número de porta para nome de serviço.
  • fsockopen() — abre uma conexão de rede por host e porta.

Conclusão

getprotobyname() resolve um nome de protocolo para o número de protocolo numérico definido no banco de dados do sistema, retornando false quando o nome é desconhecido. Lembre-se de testar o resultado com uma comparação estrita === false para que o valor válido 0 do protocolo ip não seja confundido com um erro, e use-a sempre que uma API de rede de baixo nível exigir um protocolo numérico em vez de um nome.

Prática

Prática
Qual é o propósito da função getprotobyname em PHP, de acordo com as informações fornecidas em https://www.w3docs.com/learn-php/getprotobyname.html?
Qual é o propósito da função getprotobyname em PHP, de acordo com as informações fornecidas em https://www.w3docs.com/learn-php/getprotobyname.html?
Was this page helpful?