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