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|falseA 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:
Para "tcp", isso imprime:
The protocol number for protocol name tcp is 6Observe 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 protocolo | Número | Significado |
|---|---|---|
ip | 0 | Internet Protocol |
icmp | 1 | Internet Control Message Protocol |
tcp | 6 | Transmission Control Protocol |
udp | 17 | User Datagram Protocol |
ipv6 | 41 | Internet 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 foundQuando 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. Usar1diretamente funciona, masgetprotobyname("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 (comohttp) 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.