Cours 1 : Utilitaires pour la programmation socket
1 Les fichiers de bases
Les fichiers suivants doivent être inclus dans tout programme nécessitant l'utilisation des sockets
# include <sys/types.h>
# include <netdb.h>
# include <netinet/in.h>
# include <arpa/inet.h> -- pour les conversions
2 La définition d'une adresse machine
Une adresse machine est définie selon le type ci-dessous :
struct in_addr {
u_long s_addr;
}
3 Les primitives de conversion pour la représentation des entiers
La manipulation des adresses au niveau des sockets va amener à manipuler deux entiers, l'
adresse IP
d'une part qui est un entier de quatre octets, le port qui est un entier de deux octets. Les machines admettent deux formats
de représentation pour les entiers longs et les entiers courts. Dans le format dit Big Endian, les octets composant un mot
de 16 bits ou de 32 bits sont numérotés de la gauche vers la droite, c'est-à-dire que l'octet de poids faible reçoit le plus
gros numéro. Dans le format Little Endian, les octets composant un mot de 16 bits ou de 32 bits sont numérotés de la droite
vers la gauche, c'est-à-dire que l'octet de poids faible reçoit le plus petit numéro. Une machine travaillant au format Big
Endian interprétera mal les entiers de format Little Endian qu'elle recevra. Aussi il est convenu que toute adresse émise
sur le réseau doit être émise selon un format dit format réseau, par opposition au format local de la machine. Par convention
ce format réseau est le format Big Endian. Ainsi une machine en émission convertira toujours les adresses IP et les numéros
de ports de son format local vers le format réseau tandis qu'une machine en réception convertira toujours les adresses IP
et les numéros de port du format réseau vers le format local.
Quatre primitives sont fournies pour permettre la conversion des entiers courts et des entiers longs du format local vers
le format réseau et vice versa.
Fonctions de conversion d'entiers du format local au format réseau
-- conversion d'un entier court du format local au format réseau
u_short htons (hostshort)
u_short hostshort;
-- conversion d'un entier long du format local au format réseau
u_long htonl (hostlong)
u_long hostlong;
-- conversion d'un entier court du format réseau au format local
u_short ntohs (netshort)
u_short netshort;
-- conversion d'un entier long du format réseau au format local
u_long ntohl (netlong)
u_long netlong ;
4 Le fichier /etc/hosts
Le fichier /etc/hosts permet de faire la correspondance entre le nom symbolique d'une machine et son adresse IP. Ce fichier
contient une ligne par machine et donne pour chaque machine son adresse IP, son
nom symbolique
principal, ses alias et éventuellement un commentaire.
/etc/hosts
Correspondance adresse IP et nom symbolique
Adresse IP nom symbolique alias, commentaire
163.173.128.6 Asimov.cnam.fr cnam iris
La fonction gethostbyname(nom) permet d'obtenir les informations relatives à une entrée du fichier /etc/hosts en spécifiant
comme paramètre de recherche le nom symbolique de la machine. Cette fonction retourne une structure de type hostent dont la
structure est donnée ci-après. La ligne #define h_addr h_addr_list[0] permet de connaître la première adresse IP de la machine.
struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses from name server */
#define h_addr h_addr_list[0] /* address, for backward compatiblity */
};
-- obtenir l'entrée etc/host de la machine de nom "nom"
struct hostent *gethostbyname (nom)
char *nom;
Programmation socket
Utilitaires pour la programmation socket
|