W3docs

Funzione PHP getservbyport(): tutto quello che devi sapere

Scopri come usare la funzione PHP getservbyport() per ottenere il nome del servizio associato a un numero di porta e un protocollo di rete.

La funzione PHP getservbyport() converte un numero di porta di rete nel nome leggibile del servizio ad esso associato — ad esempio, la porta 80 diventa http e la porta 443 diventa https. È l'inversa di getservbyname(), che opera in senso contrario (nome → porta). Questa pagina illustra la sintassi, la provenienza dei dati, le insidie più comuni e come utilizzare la funzione nel codice reale.

Cosa fa getservbyport()

getservbyport() cerca il nome del servizio noto che un sistema operativo associa a una coppia porta/protocollo. Non apre un socket, non contatta un server e non esegue alcuna scansione — legge semplicemente una tabella di lookup locale gestita dal sistema operativo:

  • Su Linux e macOS, la tabella è il file /etc/services.
  • Su Windows, si trova in %WINDIR%\System32\drivers\etc\services.

Poiché la risposta proviene da un file statico, la funzione è veloce e funziona offline, ma conosce solo le porte elencate in quel file. Una porta per un'applicazione personalizzata (ad esempio 8080 per il server di sviluppo) restituirà di solito false perché non è registrato alcun nome di servizio per essa.

Sintassi

getservbyport(int $port, string $protocol): string|false

Parametri

  • $port — il numero di porta da cercare, come intero (ad esempio 80, 443, 22).
  • $protocol — il nome del protocollo, "tcp" o "udp". Contrariamente a quanto suggeriscono alcune fonti, questo argomento è obbligatorio, non opzionale. Lo stesso numero di porta può corrispondere a nomi di servizio diversi a seconda del protocollo.

Valore restituito

  • Il nome del servizio come stringa (ad esempio "http") quando viene trovata una corrispondenza.
  • false quando la coppia porta/protocollo non è registrata. Verifica sempre il risultato con il confronto stretto === false, perché un nome di servizio valido potrebbe altrimenti essere scambiato per un valore falsy.

Esempio di base

php— editable, runs on the server

Qui chiediamo il servizio TCP sulla porta 80. Su un sistema standard la ricerca ha successo e stampa:

The service name for port number 80 and protocol name tcp is http

Poiché confrontiamo con === false, una porta non registrata viene segnalata in modo chiaro invece di produrre un messaggio confuso.

Ricerca di più porte

Quando hai un elenco di porte — ad esempio per etichettare le voci in un log del firewall — esegui un ciclo su di esse e risolvi ciascuna:

<?php

$ports = [22, 25, 53, 443, 49152];

foreach ($ports as $port) {
  $service = getservbyport($port, "tcp");
  echo $service === false
    ? "Port $port/tcp: unknown service\n"
    : "Port $port/tcp: $service\n";
}

Output tipico (la porta 49152 rientra nell'intervallo privato/dinamico e non è un servizio registrato, quindi finisce nel ramo "unknown"):

Port 22/tcp: ssh
Port 25/tcp: smtp
Port 53/tcp: domain
Port 443/tcp: https
Port 49152/tcp: unknown service

Quando usarla (e quando no)

Usa getservbyport() quando vuoi un'etichetta leggibile per una porta nota: visualizzazione di file di log, costruzione di un pannello di rete o validazione della configurazione. Non è un modo per verificare se una porta è aperta o in uso — non tocca mai la rete. Per testare la connettività hai bisogno di una vera funzione socket come fsockopen().

Insidie comuni

  • Dimenticare l'argomento del protocollo. getservbyport(80) genera un errore; passa sempre "tcp" o "udp".
  • Aspettarsi che le porte personalizzate vengano risolte. Le porte non presenti in /etc/services restituiscono false anche se un server è in ascolto su di esse.
  • Confronto non stretto. Usa === false, non == false o !$result, per evitare che i casi limite con stringhe vuote vengano interpretati erroneamente.

Funzioni correlate

  • getservbyname() — la ricerca inversa, da nome del servizio a numero di porta.
  • getprotobyname() — risolve il nome di un protocollo (come "tcp") nel suo numero di protocollo.
  • gethostbyname() — risolve un hostname in un indirizzo IPv4.
  • fsockopen() — apre una connessione di rete reale verso un host e una porta.

Conclusione

getservbyport() è un piccolo ma utile strumento che traduce una coppia porta/protocollo nel nome del servizio registrato leggendo il file dei servizi del sistema. Ricorda che l'argomento del protocollo è obbligatorio, che le porte sconosciute restituiscono false e che la funzione esegue una ricerca locale senza alcuna attività di rete. Abbinala a getservbyname() per la direzione inversa e a fsockopen() quando hai effettivamente bisogno di comunicare con un servizio.

Pratica

Pratica
Cosa fa la funzione getservbyport() in PHP?
Cosa fa la funzione getservbyport() in PHP?
Was this page helpful?