Funzione PHP getprotobyname(): Tutto Quello che Devi Sapere
Scopri come usare la funzione PHP getprotobyname() per ottenere il numero di protocollo associato a un nome di protocollo.
Quando lavori con il networking di basso livello in PHP, a volte hai un nome di protocollo come tcp o udp ma hai bisogno del suo numero di protocollo numerico — il valore assegnato a quel protocollo da IANA e usato all'interno degli header dei pacchetti IP. La funzione getprotobyname() esegue esattamente quella ricerca. Questa pagina tratta la sua sintassi, il valore di ritorno, i numeri di protocollo più comuni, la gestione degli errori e come si relaziona alle altre funzioni di ricerca protocollo/servizio in PHP.
Cos'è la funzione getprotobyname()?
La funzione getprotobyname() è una funzione PHP integrata che mappa un nome di protocollo al suo numero corrispondente. Legge il database dei protocolli del sistema — tipicamente /etc/protocols sui sistemi Unix-like e %SystemRoot%\System32\drivers\etc\protocol su Windows — quindi i nomi che riconosce sono quelli elencati lì (ad esempio ip, icmp, tcp, udp, ipv6).
È l'inverso di getprotobynumber(), che converte un numero in un nome. In genere hai bisogno di un numero di protocollo grezzo quando apri un raw socket con socket_create() e API simili di basso livello, dove il protocollo deve essere specificato numericamente.
Sintassi
getprotobyname(string $protocol): int|falseLa funzione accetta un parametro:
$protocol— il nome del protocollo da cercare. La ricerca è case-insensitive, quindi"TCP"e"tcp"restituiscono lo stesso risultato.
Restituisce un intero che rappresenta il numero del protocollo, oppure false se il nome del protocollo non viene trovato nel database di sistema.
Esempio base
Ecco come cercare il numero per il protocollo tcp e gestire il caso in cui la ricerca fallisce:
Per "tcp" questo stampa:
The protocol number for protocol name tcp is 6Nota il confronto stretto === false. Poiché il numero di protocollo valido più piccolo è 0 (il protocollo ip), un controllo non stretto come if (!$protocol_number) tratterebbe erroneamente una ricerca ip riuscita come un fallimento. Confronta sempre con false usando ===.
Numeri di protocollo comuni
Questi sono i valori che vedrai più spesso. Provengono direttamente dal database dei protocolli di sistema, quindi sono stabili su tutte le piattaforme:
| Nome protocollo | Numero | Significato |
|---|---|---|
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 |
Ricerca di più protocolli
Puoi scorrere un elenco di nomi e riportare ogni risultato, gestendo con eleganza i nomi sconosciuti:
<?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";
}
}Questo produce:
tcp => 6
udp => 17
icmp => 1
bogus: not foundQuando usare questa funzione?
Nello sviluppo web quotidiano raramente hai bisogno di numeri di protocollo — fopen(), cURL e i wrapper di stream accettano tutti URL, non numeri grezzi. Ricorri a getprotobyname() quando scendi di un livello:
- Creazione di raw socket.
socket_create(AF_INET, SOCK_RAW, getprotobyname("icmp"))scrive il numero di protocollo nel socket. Codificare1direttamente funziona, magetprotobyname("icmp")documenta l'intenzione e rimane corretto anche se il database differisce. - Costruzione o analisi di pacchetti IP, dove il campo del protocollo è numerico.
- Strumenti di rete e diagnostica che riportano sia il nome che il numero di un protocollo.
Funzioni correlate
getprotobynumber()— la ricerca inversa: da numero a nome.getservbyname()— mappa il nome di un servizio (comehttp) più un protocollo a un numero di porta.getservbyport()— l'inverso: da numero di porta a nome del servizio.fsockopen()— apre una connessione di rete tramite host e porta.
Conclusione
getprotobyname() risolve un nome di protocollo nel numero di protocollo numerico definito nel database di sistema, restituendo false quando il nome è sconosciuto. Ricorda di testare il risultato con un confronto stretto === false in modo che il valore valido 0 di ip non venga scambiato per un errore, e usala ogni volta che un'API di rete di basso livello si aspetta un protocollo numerico anziché un nome.