Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Networking in PHP: gestire DNS e nomi di domino

Come si possono analizzare, gestire e integrare nelle proprie applicazioni i protocolli di rete e gli strumenti per gestire DNS e nomi di host in PHP
Come si possono analizzare, gestire e integrare nelle proprie applicazioni i protocolli di rete e gli strumenti per gestire DNS e nomi di host in PHP
Link copiato negli appunti

Con il termine DNS (Domain Name System) si indica un servizio che viene impiegato per la risoluzione di nomi di Host nei corrispondenti indirizzi IP o viceversa. Il nome di dominio "www.google.it" è ad esempio associato all'indirizzo IP "74.125.43.99" e la conversione del nome di dominio nel relativo IP è possibile grazie all'utilizzo di un server DNS.

PHP mette a disposizione alcuni validi strumenti per lavorare con i DNS e in particolare per il reperimento di informazioni, in questa breve trattazione verranno analizzate alcune funzioni che potranno essere integrate in applicazioni che richiedono servizi per la risoluzione di nomi di Host o indirizzi IP, come nel caso di script per cui sono previste connessioni tramite API socket.

Funzioni per la risoluzione dei nomi di Host

gethostbyname() è una delle funzioni più semplici da utilizzare tra quelle messe a disposizione da PHP per la risoluzione dei nomi di Host; essa accetta l'Hostname di una postazione come unico argomento e restituisce in output il corrispondente indirizzo IP.

Di seguito viene mostrato un semplice esempio per l'utilizzo di questa funzione:

<?php 
# nome dell'Host da risolvere
$nome_di_host = "www.html.it";
# traduzione del nome dell'Host in indirizzo IP 
$indirizzo_ip = gethostbyname($nome_di_host);
# output dell'Hostname risolto
echo "L'indirizzo IP di "$nome_di_host" è "$indirizzo_ip"."; 
?>

La semplice applicazione proposta visualizza l'indirizzo IP corrispondente al nome di Host fornito come argomento alla funzione gethostbyname() sotto forma di una stringa numerica suddivisa da punti fermi.

Una funzione molto simile a quella appena descritta è gethostbynamel(), in questo caso però il suo utilizzo permette di ottenere un elenco completo di tutti gli indirizzi IP associati ad un determinato nome di Host; è il caso per esempio di server che supportano indirizzi IP virtuali multipli.

Chi utilizza il prompt di MS-Dos o la shell di Linux per effettuare interrogazioni verso i DNS si sarà sicuramente accorto che la funzione gethostbyname() svolge un compito per certi versi simile alle istruzioni da linea di comando basate su ping, pingareun nome di dominio vuol dire infatti anche cercare informazioni sul corrispondente indirizzo IP.

gethostbynamel(), come gethostbyname(), accetta come parametro un unico argomento che anche in questo caso è l'Hostname che si desidera risolvere, stavolta però gli indirizzi IP restituiti dall'esecuzione potrebbero essere più di uno e la funzione dovrà restituire in output un array destinato a contenerli come valori. Vediamo qualche esempio.

Un semplice esempio di utilizzo della funzione gethostbynamel() potrebbe essere il seguente:

<?php 
# nome dell'Host/parametro della funzione
$nome_di_host= "HTML.it"; 
# traduzione del nome dell'Host in indirizzi IP 
$indirizzo_ip= gethostbynamel($nome_di_host);
# visualizzazione in output degli indirizzi IP
echo("Gli indirizzi IP per "$nome_di_host" sono:<br />n"); 
for ($i = 0; $i < count($indirizzo_ip); $i++) {
echo("$indirizzo_ip[$i] <br />n"); 
}
?>

Basterà quindi un semplice ciclo per scorrere tutti i valori presenti all'interno dell'array prodotto tramite l'utilizzo della funzione gethostbynamel(), nell'esempio appena proposto è stato utilizzato un ciclo for ma il risultato sarebbe stato lo stesso con un comune ciclo foreach:

<?php
# nome dell'Host/parametro della funzione
$nome_di_host= "HTML.it"; 
# traduzione del nome dell'Host in indirizzi IP 
$indirizzo_ip = gethostbynamel($nome_di_host);
# visualizzazione in output degli indirizzi IP
if (is_array($indirizzo_ip)) {
     echo("Gli indirizzi IP per "$nome_di_host" sono:<br />n"); 
     foreach ($indirizzo_ip as $ip) {
          echo $ip."<br />n";
     }
} else {
# notifica nel caso non venga prodotto l'array
     echo "Nessun IP rilevato per ".$nome_di_host.".";
}
?>

Un'ultima funzione per i DNS in PHP che necessita di una segnalazione è gethostbyaddr(); come sarà facile intuire dal nome, gethostbyaddr() svolge una funzione esattamente opposta a quella di gethostbyname(), cioè permette di risolvere un indirizzo IP passato come unico argomento per ricevere in output il corrispondente Hostname.

Si analizzi un semplice esempio di script basato sull'utilizzo di gethostbyaddr():

<?php 
# indirizzo IP da utilizzare quale parametro
$indirizzo_ip = "127.0.0.1"; 
# traduzione dell'indirizzo IP
$nome_di_host = gethostbyaddr($indirizzo_ip);
# visualizzazione del nome dell'Hostname
echo "L'hostname dell'IP "$indirizzo_ip" è "$nome_di_host".";
?>

Testando questo semplice listato in locale si otterrà in output il nome della macchina su cui gira l'applicazione.

PHP e protocolli di Rete

Il protocollo TCP/IP (Transmission Control Protocol e Internet Protocol) racchiude all'interno di sé gli standard che sono stati sviluppati per mettere in comunicazione macchine diverse anche con differenti collocazioni geografiche; TCP/IP è il protocollo di connessione più utilizzato in Rete e si basa sul principio che ogni macchina è identificabile attraverso un indirizzo IP.

Per l'utilizzo del protocollo TCP/IP è quindi corretto che ad un dispositivo corrisponda un indirizzo IP, ma non è strettamente necessario che ogni postazione possegga un nome di DNS, in questo caso il nome della macchina corrisponderà all'indirizzo IP e potrà essere utile recuperare informazioni riguardo ai protocolli utilizzati.

La funzione getprotobyname() permette di ottenere il numero di protocollo associato ad un determinato nome di protocollo (come per esempio TCP, IP etc.) all'interno di un sistema locale; il test del seguente esempio permetterà di chiarire al meglio quanto appena esposto:

<?php
# nomi dei protocolli
$protocolli = array("egp","ggp","hmp","icmp","ip",
"pup","rdp","rvd","tcp","udp","xns-idp");
# lettura dei nomi di protocollo tramite ciclo
for($i=0;$i<count($protocolli);$i++)
{
 $nome_protocollo = $protocolli[$i];
# numeri corrispondenti ai nomi di protocollo
 echo $nome_protocollo .":", getprotobyname ($nome_protocollo)."<br />n";
}
?>

getprotobyname() restituisce -1 nel caso in cui un protocollo non venga riconosciuto, nel caso in cui invece l'esito sia positivo la funzione restituisce un numero intero univoco associato al nome di protocollo passato come parametro; la mappa completa dei nomi di protocollo in un sistema locale si trova generalmente all'interno del percorso /etc/protocols nelle piattaforme UNIX o UNIX-like come Linux e %SystemRoot%system32driversetcprotocol per alcune piattaforme Windows.

getprotobynumber() è invece una funzione nativa di PHP che svolge il compito inverso rispetto a quello di getprotobyname(), infatti viene utilizzata per recuperare il nome di un protocollo a partire da un numero intero (o un intervallo di numeri interi) passato come argomento; nel caso in cui un determinato numero di protocollo non venga riconosciuto, la funzione restituirà FALSE.

Si passi ora ad analizzare il funzionamento di un altro costrutto: getservbyname()è una funzione pensata per restituire il numero di porta relativo ad un dato servizio Internet e ad un protocollo, che sono anche gli argomenti da passare ad essa come parametri. Si osservi il seguente esempio:

<?php
# nomi dei servizi
$nome_servizio = array('ftp','http','imap','pop3','smtp','www');
# lettura dei nomi dei servizi tramite ciclo
foreach ($nome_servizio as $value) {
   # passaggio dei parametri alla funzione
    $porta = getservbyname($value, 'tcp');
   # visualizzazione dei numeri delle porte
    echo $value . ": " . $porta . "<br />n";
}
?>

Grazie all'esecuzione dello script proposto sarà possibile visualizzare il numero della porta (in ascolto tramite il protocollo TCP) corrispondente ad ogni nome di servizio passato come valore all'array. In alternativa a TCP è possibile utilizzare UDP, ma nel caso in cui un determinato servizio o protocollo non venga trovato, la funzione restituirà FALSE; la mappa completa delle porte assegnati ai servizi si trova sul percorso /etc/services nei sistemi UNIX.

Anche getservbyname(), come i casi analizzati in precedenza, ha la sua funzione inversa chiamata getservbyport() che ha il compito di restituire il nome di un servizio Internet associato ad un numero intero corrispondente ad una porta relativamente al protocollo passato come parametro (TCP o UDP); se per esempio si desidera sapere quale servizio è in funzione sulla porta numero 25 (plausibilmente SMTP), sarà possibile utilizzare la funzione descritta in questo modo:

<?php
# definizione dei parametri da passare alla funzione
$porta = 25;
$protocollo = "tcp";
# passaggio dei parametri alla funzione
$servizio = getservbyport($porta, $protocollo); 
# output completo del numero di posta e del nome di servizio richiesto
echo "Il servizio Internet attivo sulla porta "$porta" è "$servizio".";
?>

Conclusioni

PHP mette a disposizione degli utilizzatori numerose funzioni utili per la gestione di DNS, nomi di Host, indirizzi IP, protocolli e servizi di Rete; in particolare si tratta di istruzioni grazie alle quali è possibile ricavare informazioni da riutilizzare all'interno delle proprie applicazioni quando queste necessitano di parametri per effettuare connessioni con servizi in locale o in remoto.

Nel corso di questa breve trattazione sono state analizzate sia le funzioni basate sulla risoluzione dei DNS, nel caso questi siano disponibili per un determinata macchina, sia le funzioni in grado di reperire dall'ambiente di esecuzione informazioni su servizi e protocolli quando non è disponibile un DNS da risolvere.

Ti consigliamo anche