Funzione gethostbyname nella lingua C

Funzione gethostbyname nella lingua C

Il linguaggio C ha un gran numero di funzioni per la programmazione delle prese. Molti di essi sono usati per ottenere le informazioni necessarie dall'host a cui deve essere stabilita una connessione. Le informazioni che questo tipo di funzione recuperano sono essenziali per una connessione di successo poiché coinvolge gli indirizzi del dominio, i numeri di porta e così via.

In questo articolo di Linux, imparerai tutto sulla funzione gethostbyname () che viene più comunemente utilizzata per risolvere e ottenere gli indirizzi IP dai nomi host.

Ti mostreremo la sintassi di questa funzione e la descrizione teorica di come funziona, i suoi argomenti di input e output, il tipo di dati utilizzato in ciascun caso e la sua dichiarazione corretta.

Quindi applichiamo ciò che abbiamo appreso attraverso gli esempi pratici, inclusi gli snippet e le immagini del codice, in cui implementiamo la funzione GethostByName () per risolvere e ottenere gli indirizzi del nome host.

Sintassi della funzione gethostByName () in lingua C

struct hostent *gethostbyname (const char *nome);

Descrizione della funzione gethostByName () in lingua C

La funzione GethostByName () restituisce l'indirizzo IP, il nome ufficiale e la famiglia di indirizzi di un nome host. Questa funzione chiede al server di risolvere e restituire l'indirizzo del nome host specificato come stringa o punta.

Se non si verifica alcun errore, gethostByName () restituisce un puntatore a una struttura di tipo "Hostent" che memorizza le informazioni sul nome host. Se si verifica un errore, viene restituito un puntatore null e il codice di identificazione dell'errore può essere recuperato tramite la variabile H_ERRNO GLOBAL.

I nomi host sono generalmente associati a un singolo indirizzo, ma ci sono casi di piattaforme di grandi dimensioni che hanno più indirizzi associati come "www.Google.com ". Per questo motivo, le strutture "Hostent" sono progettate per contenere un elenco di indirizzi. A ciascuno di essi è possibile accedere utilizzando l'array di puntatori "H_ADDR_LIST". Più avanti, esiste una sezione speciale che spiega tutto su questo tipo di struttura.

Sebbene la funzione gethostByName () sia considerata deprecata ed è stata sostituita da getAddRinfo (), la sua semplicità nell'invocazione del metodo e gli argomenti di input lo rende molto utile quando è necessario solo l'indirizzo di un nome host.

La funzione gethostByName (), così come tutte le altre funzioni della famiglia Getostxxxx (), le strutture e le variabili che usano, sono dichiarate nel "netdb.H ”intestazione. Quindi, devi includerli nel tuo codice come segue:

#includere

Come ottenere l'indirizzo di un nome host con la funzione gethostbyname () in lingua c

In questo esempio, useremo la funzione gethostbyname () per ottenere l'indirizzo e il nome ufficiale del “Www.kernel.org " Nome host.

Passo 1: Il primo passo è inserire le intestazioni richieste e creare una funzione principale () che restituisce un valore vuoto.

Passo 2: All'interno della funzione principale (), dichiariamo l'host del puntatore a una struttura di tipo Hostent che funge da argomento di output di gethostByName (). Dichiariamo anche un array di 256 caratteri chiamato "buffer" che memorizza la stringa che contiene il nome dell'host che passiamo come argomento di input.

Passaggio 3: Dopo aver dichiarato le variabili e la struttura che utilizziamo, chiamiamo la funzione gethostbyname (), passando il buffer come argomento di input e struttura host come argomenti di output.

Passaggio 4: Se la funzione restituisce correttamente, il passo successivo è visualizzare il nome e l'indirizzo ufficiali. Per questo, utilizziamo la funzione printf () in due chiamate. La prima chiamata mostra il nome ufficiale del dominio, una stringa che è indicata dall'elemento H_Name della struttura host. La seconda chiamata mostra l'indirizzo che viene archiviato in H_ADDR_LIST [0], definito come H_ADDR, che convertiamo in una stringa usando la funzione INET_NTOA ().

Di seguito è riportato il codice completo con tutti e quattro i passaggi per questo esempio:

//Passo 1
#includere
#includere
#includere
#includere
#includere
#includere
void main ()
//Passo 2

Ospite Structostent *;
char buffer [255] = "www.kernel.org ";
// Passaggio 3
host = gethostbyname (buffer);
// Passaggio 4
printf ("\ Nip indirizzo di %s è:", host-> h_name);
printf ("%s \ n \ n", inet_ndoa (*(structin_addr*) host-> h_addr));

La seguente immagine mostra la compilazione e l'esecuzione di questo codice. Come possiamo vedere, gethostByName () ottiene un'informazione dal “Www.kernel.org " dominio e lo memorizza in una struttura "hostent".

La struttura ospitante

La struttura "Hostent" memorizza i dati utili forniti dal server quando viene effettuata una query con funzioni come GethostByName (). Questa connessione socket è prequertata per risolvere gli indirizzi e restituire le informazioni come il nome di dominio, la famiglia degli indirizzi e un elenco di indirizzi se esiste più di uno. Puoi vedere questa struttura insieme a una descrizione dettagliata di ciascun elemento nella seguente:

struct hostent

char *h_name;
char ** h_aliases;
inth_addrtype;
inth_length;
char ** h_addr_list;
#defineh_addrh_addr_list [0]
;

h_name: Questo è un puntatore a una stringa con il nome di dominio per il quale viene interrogato.

H_ALIASES: È un elenco di nomi alternativi.

H_ADDRTYPE: Questo membro specifica la famiglia degli indirizzi per la quale viene interrogato.

h_length: Specifica la dimensione dell'indirizzo.

h_addr_list: Questo è il puntatore a un elenco di puntatori dell'indirizzo. Se il server restituisce più di un indirizzo per il nome interrogato, si accede a ciascuno tramite questo puntatore dell'elenco.

h_addr: Per semplicità, questa struttura definisce H_ADDR come puntatore al primo indirizzo nell'H_ADDR_LIST. L'accesso è attraverso questa definizione.


Errori che possono verificarsi quando si utilizza la funzione gethostbyname (): come riconoscerli e identificarli

La funzione gethostbyname () restituisce un puntatore nullo in caso di errore. Il modo più semplice per rilevare un errore è utilizzare una condizione "if" in cui la condizione di input è il puntatore di output con un valore nullo. Quello che segue è un frammento di codice che mostra questa tecnica:

if ((host = gethostByName (buffer)) == null)
printf ("si è verificato un errore durante il tentativo di ottenere informazioni dal server.");

Quando si verifica un errore, il suo valore di identificazione numerica viene automaticamente archiviato nella variabile globale H_errno. Le definizioni degli errori e della loro rappresentazione numerica sono specificate in “Netdb.H" intestazione.

Quello che segue è un estratto dal "netdb.H ”Intestazione con gli errori che la funzione gethostByName () può generare, il loro valore numerico in H_errno e una breve descrizione di ogni errore:

Definizione Valore Errore
HOST NON TROVATO 1 Host non trovato.
RIPROVA 2 Non autoritativo. Host non trovato.
No_recovery 3 Errore non recuperabile.
NESSUN DATO 4 Nome valido, nessun record di dati di tipo richiesto.

Il modo più semplice per identificare un errore è aprire un salto condizionale nella condizione "if" che abbiamo visto prima. La condizione di salto è la variabile H_ERRNO. Ogni caso è la definizione di ciascuno degli errori che abbiamo appena descritto.

Ora, esaminiamo il codice del primo esempio in cui inseriamo questo metodo per rilevare e identificare gli errori nel passaggio 3.

//Passo 1
#includere
#includere
#includere
#includere
#includere
#includere
void main ()
void main ()
//Passo 2

Ospite Structostent *;
char buffer [255] = "www.000000000.com ";
// Passaggio 3
if ((host = gethostByName (buffer)) == null)
switch (h_errno)
Caso host_not_found:
printf ("host non trovato. Errore %i \ n ", h_errno);
rottura;
Case Try_again:
printf ("non autoritativo. Host non trovato. Errore %i \ n ", h_errno);
rottura;
Caso No_Data:
printf ("Nome valido, nessun record di dati di tipo richiesto. Errore %i \ n ", h_errno);
rottura;
Caso No_Recovery:
printf ("Errore non recuperabile. Errore %i \ n ", h_errno);
rottura;


Altro
// Passaggio 4
printf ("\ Nip indirizzo di %s è:", host-> h_name);
printf ("%s \ n \ n", inet_ndoa (*(structin_addr*) host-> h_addr));

Come puoi vedere, specifichiamo un dominio inesistente nel buffer che funge da argomento di input per la funzione GetostbyName () in questo caso. Ciò si traduce in un errore identificato nell'interruttore di salto condizionale.

La seguente immagine mostra la compilazione e l'esecuzione di questo codice. In questo caso, la funzione gethostbyname () non è riuscita a trovare l'host. Quindi, il programma salta al

Host _not_ trovato caso della condizione di switch:

Conclusione

In questo articolo di Linux, ti abbiamo mostrato come utilizzare la funzione gethostbyname () per ottenere informazioni su un nome host. Abbiamo imparato la descrizione teorica di come funziona e come sono composti gli argomenti di input e output, inclusa una sezione speciale che descrive come è composta una struttura "hostent".

Abbiamo quindi implementato l'uso di questa funzione in esempi pratici. In tal modo, abbiamo usato i frammenti di codice per mostrare le intestazioni necessarie per il suo uso, la dichiarazione di strutture e variabili per i loro argomenti e la conversione e la visualizzazione delle informazioni ottenute.

Inoltre, abbiamo incluso una sezione che spiega i possibili errori che questa funzione può generare e insegnare le tecniche per rilevarli e identificarli.

Come abbiamo visto in questo articolo, la semplicità di questa funzione e la sua rapida implementazione significa che è comunque utile, anche se è stata considerata obsoleta.