Fonction de Gethostbyname dans le langage C

Fonction de Gethostbyname dans le langage C

Le langage C a un grand nombre de fonctions pour la programmation des prises. Beaucoup d'entre eux sont utilisés pour obtenir les informations nécessaires de l'hôte à laquelle une connexion doit être établie. Les informations réalisées que ce type de fonction récupère est essentielle pour une connexion réussie car elle implique les adresses de domaine, les numéros de port, etc.

Dans cet article de Linux Hint, vous apprendrez tout sur la fonction GethostByName () qui est le plus souvent utilisé pour résoudre et obtenir les adresses IP à partir des noms d'hôtes.

Nous vous montrerons la syntaxe de cette fonction et la description théorique de son fonctionnement, ses arguments d'entrée et de sortie, le type de données utilisé dans chaque cas et sa déclaration correcte.

Nous appliquons ensuite ce que nous avons appris à travers les exemples pratiques, y compris les extraits de code et les images, où nous implémentons la fonction GethostByname () pour résoudre et obtenir les adresses de nom d'hôte.

Syntaxe de la fonction GethostByName () dans le langage C

struct hostent * gethostbyname (const char * name);

Description de la fonction gethostbyname () dans le langage C

La fonction gethostbyname () renvoie l'adresse IP, le nom officiel et la famille d'un nom d'hôte. Cette fonction demande au serveur de résoudre et de renvoyer l'adresse du nom d'hôte qui est spécifié sous forme de chaîne ou de pointeur dans son nom d'argument d'entrée unique.

Si aucune erreur ne se produit, GethostByName () renvoie un pointeur vers une structure de type «hôte» qui stocke les informations de nom d'hôte. Si une erreur se produit, un pointeur nul est renvoyé et le code d'identification d'erreur peut être récupéré via la variable globale H_ERRNO.

Les noms d'hôtes sont généralement associés à une seule adresse, mais il existe des cas de grandes plateformes qui ont plusieurs adresses associées telles que «www.Google.com ». Pour cette raison, les structures «hôte» sont conçues pour contenir une liste d'adresses. Chacun d'eux est accessible en utilisant le tableau de pointeurs «H_ADDR_LIST». Plus loin, il y a une section spéciale qui explique tout sur ce type de structure.

Bien que la fonction gethostbyname () soit considérée comme obsolète et a été remplacée par getAddrinfo (), sa simplicité dans l'invocation de la méthode et les arguments d'entrée le rend très utile lorsque vous n'avez besoin que de l'adresse d'un nom d'hôte.

La fonction GethostByName (), ainsi que toutes les autres fonctions de la famille Gethostxxxx (), les structures et les variables qu'ils utilisent, sont déclarées dans le «NetDB.en-tête h ”. Vous devez donc les inclure dans votre code comme dans les éléments suivants:

#inclure

Comment obtenir l'adresse d'un nom d'hôte avec la fonction gethostbyname () dans le langage C

Dans cet exemple, nous utiliserons la fonction GethostByName () pour obtenir l'adresse et le nom officiel du «Www.noyau.org " nom d'hôte.

Étape 1: La première étape consiste à insérer les en-têtes requis et à créer une fonction Main () qui renvoie une valeur vide.

Étape 2: À l'intérieur de la fonction Main (), nous déclarons l'hôte du pointeur vers une structure de type hôte qui sert de l'argument de sortie de GethostByname (). Nous déclarons également un tableau de 256 caractères appelé «tampon» qui stocke la chaîne qui contient le nom de l'hôte que nous passons comme argument d'entrée.

Étape 3: Après avoir déclaré les variables et la structure que nous utilisons, nous appelons la fonction GethostByname (), passant le tampon comme argument d'entrée et la structure de l'hôte comme arguments de sortie.

Étape 4: Si la fonction revient avec succès, l'étape suivante consiste à afficher le nom et l'adresse officiels. Pour cela, nous utilisons la fonction printf () en deux appels. Le premier appel montre le nom officiel du domaine, une chaîne qui est indiquée par l'élément h_name de la structure hôte. Le deuxième appel montre l'adresse stockée dans H_ADDR_LIST [0], définie comme H_ADDR, que nous convertissons en une chaîne à l'aide de la fonction INET_NTOA ().

Ce qui suit est le code complet avec les quatre étapes de cet exemple:

//Étape 1
#inclure
#inclure
#inclure
#inclure
#inclure
#inclure
vide main ()
//Étape 2

Hôte StrucHostent *;
tampon char [255] = "www.noyau.org ";
//Étape 3
host = gethostbyname (tampon);
//Étape 4
printf ("\ nip l'adresse de% s est:", host-> h_name);
printf ("% s \ n \ n", INET_NTOA (* (Structin_addr *) host-> h_addr));

L'image suivante montre la compilation et l'exécution de ce code. Comme nous pouvons le voir, GethostByName () obtient une information «Www.noyau.org " domaine et le stocke dans une structure «hôte».

La structure hôte

La structure «hôte» stocke les données utiles qui sont fournies par le serveur lorsqu'une requête est faite avec des fonctions telles que GethostByname (). Cette connexion à socket est préquiet pour résoudre les adresses et renvoie les informations telles que le nom de domaine, la famille d'adresses et une liste d'adresses si plus d'un. Vous pouvez voir cette structure avec une description détaillée de chaque élément dans ce qui suit:

HOSTENT STRUCT

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

h_name: Ceci est un pointeur vers une chaîne avec le nom de domaine pour lequel il est interrogé.

h_alias: C'est une liste de noms alternatifs.

h_addrtype: Ce membre spécifie la famille d'adresses pour laquelle il est interrogé.

h_length: Il spécifie la taille de l'adresse.

h_addr_list: Ceci est le pointeur vers une liste de pointeurs d'adresse. Si le serveur renvoie plus d'une adresse pour le nom interrogé, chacun est accessible via ce pointeur de liste.

h_addr: Pour plus de simplicité, cette structure définit le H_ADDR comme un pointeur vers la première adresse du H_ADDR_LIST. L'accès se fait par cette définition.


Erreurs qui peuvent se produire lors de l'utilisation de la fonction GethostByName (): comment les reconnaître et les identifier

La fonction gethostbyname () renvoie un pointeur nul en cas d'erreur. La façon la plus simple de détecter une erreur est d'utiliser une condition «IF» où la condition d'entrée est le pointeur de sortie avec une valeur nul. Ce qui suit est un extrait de code qui montre cette technique:

if ((host = gethostbyname (tampon)) == null)
printf ("Une erreur s'est produite en essayant d'obtenir des informations du serveur.");

Lorsqu'une erreur se produit, sa valeur d'identification numérique est automatiquement stockée dans la variable globale H_ERRNO. Les définitions des erreurs et leur représentation numérique sont spécifiées dans le «NetDB.h ” entête.

Ce qui suit est un extrait du «NetDB.En-tête h ”avec les erreurs que la fonction GethostByname () peut générer, leur valeur numérique dans H_ERRNO et une brève description de chaque erreur:

Définition Valeur Erreur
HÉBERGEUR NON TROUVÉ 1 Hébergeur non trouvé.
ESSAYER À NOUVEAU 2 Non autoritaire. Hébergeur non trouvé.
No_recovery 3 Erreur non récupérable.
PAS DE DONNÉES 4 Nom valide, aucun enregistrement de données du type demandé.

La façon la plus simple d'identifier une erreur est d'ouvrir un interrupteur conditionnel sauter dans la condition «si» que nous avons vue plus tôt. La condition de saut est la variable h_errno. Chaque cas est la définition de chacune des erreurs que nous venons de décrire.

Maintenant, regardons le code du premier exemple où nous insérons cette méthode pour détecter et identifier les erreurs à l'étape 3.

//Étape 1
#inclure
#inclure
#inclure
#inclure
#inclure
#inclure
vide main ()
vide main ()
//Étape 2

Hôte StrucHostent *;
tampon char [255] = "www.000000000.com ";
//Étape 3
if ((host = gethostbyname (tampon)) == null)
switch (h_errno)
cas host_not_found:
printf ("hôte introuvable. Error% i \ n ", h_errno);
casser;
cas try_again:
printf ("non autoritaire. Hébergeur non trouvé. Error% i \ n ", h_errno);
casser;
cas no_data:
printf ("nom valide, pas d'enregistrement de données du type demandé. Error% i \ n ", h_errno);
casser;
cas no_recovery:
printf ("Erreur non récupérable. Error% i \ n ", h_errno);
casser;


Autre
//Étape 4
printf ("\ nip l'adresse de% s est:", host-> h_name);
printf ("% s \ n \ n", INET_NTOA (* (Structin_addr *) host-> h_addr));

Comme vous pouvez le voir, nous spécifions un domaine inexistant dans le tampon qui sert de l'argument d'entrée à la fonction GethostByname () dans ce cas. Il en résulte une erreur qui est identifiée dans l'interrupteur de saut conditionnel.

L'image suivante montre la compilation et l'exécution de ce code. Dans ce cas, la fonction gethostbyname () n'a pas pu trouver l'hôte. Ainsi, le programme saute au

Hôte _not_ Found Cas de la condition de commutateur:

Conclusion

Dans cet article de Linux Hint, nous vous avons montré comment utiliser la fonction GethostByName () pour obtenir des informations sur un nom d'hôte. Nous avons appris la description théorique de son fonctionnement et comment les arguments d'entrée et de sortie sont composés, y compris une section spéciale qui décrit comment une structure «hôte» est composée.

Nous avons ensuite mis en œuvre l'utilisation de cette fonction dans des exemples pratiques. Ce faisant, nous avons utilisé les extraits de code pour afficher les en-têtes nécessaires pour son utilisation, la déclaration de structures et de variables pour leurs arguments et la conversion et l'affichage des informations obtenues.

De plus, nous avons inclus une section qui explique les erreurs possibles que cette fonction peut générer et enseigner les techniques pour les détecter et les identifier.

Comme nous l'avons vu dans cet article, la simplicité de cette fonction et sa mise en œuvre rapide signifie qu'elle est toujours utile, même si elle était considérée comme obsolète.