Information sur le host
Include nécessaire: #include <netdb.h>
La première fonction retourne des informations sur le host dont vous aurez passé le nom ou l'adresse IP en paramètre:
struct hostent *gethostbyname(const char *name);
En entrée:
name : pointeur sur une chaine de caractères qui contiendra le nom ou l'adresse IP(V4 ou V6) du host.
L'adresse IP principal
Le nom principal
Les alias donnés au host
Les autres adresses IP utilisables
- Vous pouvez aussi
passer une adresse IP (V4 ou V6) mais, généralement, la fonction
se contentera de recopier la valeur IP dans le nom du host. Il sera alors nécessaire
d'utiliser la fonction expliquée ci-après pour connaître
le nom du host. Solution utilisée dans l'exemple de code fourni...
- Cette fonction va en fait utiliser principalement le fichier /etc/hosts (sous unix) ou le fichier hosts de windows pour déterminer l'ensemble des informations.
struct hostent *gethostbyaddr(const void *addr, int len, int type);
Erreurs
Pour les deux fonctions citées ci-dessus, les erreurs peuvent être
positionnées. Si celles-ci retournent un pointeur sur la structure hostent,
pas de problème, mais si la valeur est NULL h_errno contient un code
erreur:
HOST_NOT_FOUND: L'hôte indiqué est inconnu.
NO_ADDRESS ou NO_DATA: Le nom est valide mais ne possède pas d'adresse IP.
NO_RECOVERY: Une erreur fatale du serveur de noms est apparue.
TRY_AGAIN: Une erreur temporaire du serveur de noms est apparue, essayez un
peu plus tard.
Voici un exemple de code utilisant ces deux fonctions:
Sous Windows, vous allez créer un projet de type "Windows console application". N'oubliez pas d'ajoutez la librairie ws2_32.lib sous Windows ou lib\libws2_32.a sous dev-c++
Sous Linux ou Unix, utilisez votre compilateur (Ex. gcc -c infohost.cpp)
getpeername()
De la même manière, il sera possible d'avoir le nom de la machine
qui est connectée sur la votre via une socket.
Pour obtenir le nom d'un correspondant connecté, nous utiliserons getpeername()
int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
En entrée:
s est l'identifiant du socket
name est un pointeur sur une zone mémoire qui recevra le nom. C'est à vous d'initialiser cette zone mémoire et ce pointeur.
namelen est la taille maximum de la zone mémoire qui va recevoir le nom.
En sortie:
La zone mémoire pointée par name recçoit le nom, namelen contient la taille réelle du nombre de caractères retournées pour ce nom. Le nom pouvant être tronqué si la zone mémoire est trop petite pour recevoir la totalité du nom.
getpeername renvoie 0 s'il réussit, ou -1 s'il échoue, Dans ce
cas errno contient le code d'erreur:
Valeur | Désignation |
EBADF | L'argument s n'est pas un descripteur valide. |
ENOTSOCK | L'argument s est un fichier, pas une socket. |
ENOTCONN | La socket n'est pas connectée. |
ENOBUFS | Pas assez de mémoire pour le noyau. |
EFAULT | name pointe en dehors de l'espace d'adressage accessible. |