W3docs

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

La 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:

php— editable, runs on the server

Per "tcp" questo stampa:

The protocol number for protocol name tcp is 6

Nota 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 protocolloNumeroSignificato
ip0Internet Protocol
icmp1Internet Control Message Protocol
tcp6Transmission Control Protocol
udp17User Datagram Protocol
ipv641Internet 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 found

Quando 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. Codificare 1 direttamente funziona, ma getprotobyname("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 (come http) 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.

Pratica

Pratica
Qual è lo scopo della funzione getprotobyname in PHP, secondo le informazioni fornite su https://www.w3docs.com/learn-php/getprotobyname.html?
Qual è lo scopo della funzione getprotobyname in PHP, secondo le informazioni fornite su https://www.w3docs.com/learn-php/getprotobyname.html?
Was this page helpful?