II/ DESCRIPTION DE L’API SOCKET

 

Librairies indispensables:

sys/socket.h
sys/types.h
arpa/inet.h
netinet/in.h
netdb.h

 

 

1/ Création d’une socket

int socket(int domaine, int type, int protocole)

Renvoie:    le numéro de descripteur de la socket,
                   -1 en cas d’échec.

domaine:     AF_UNIX, AF_INET, AF_ISO, AF_NS
type:            SOCK_DGRAM, SOCK_STREAM
protocole:    0 pour laisser le système choisir en fonction du couple domaine/type.

 

 

2/ Suppression d’une socket

        Il existe deux possibilités pour fermer une socket. Celle-ci est un flux full-duplex, c’est à dire qu’elle peut émettre et recevoir des données. La première fonction, close, ferme totalement la socket, la deuxième, shutdown, permet une fermeture de la socket que dans un sens.

A/ int close(int sockDesc)

sockDesc:    descripteur de la socket à fermer et à supprimer de la table des descripteurs de fichier.

 Libère les ressources de la socket si elle sont plus partagées. En T.C.P., vide le tampon d’émission.

B/ int shutdown(int sockDesc, int sens)

sockDesc:    descripteur de la socket.
sens:             0 plus de lecture, read/recv renvoient 0
                     1 plus d’écriture, write/send provoque SIGPIPE
                     2 plus de lecture/écriture.

Permet de fermer partiellement le descripteur de la socket en mode SOCK_STREAM.

 

 

3/ Attachement à une adresse

        Lorsqu’une socket est créée par le processus, celle-ci lui est accessible grâce à son descripteur. Seulement celui-ci est une variable locale au processus. Pour qu’un autre processus puisse communiquer avec cette socket, il faut donc l’attacher à une adresse externe visible partout. C’est ce que fait la fonction bind. L'adresse extérieur dépend du domaine de la socket:

- en local (AF_UNIX), c’est un fichier.
- Pour Internet (AF_INET), c’est le nom de la machine plus un numéro de port.

int bind(int sockDesc, struct sockaddr* adSock, size_t tailleAd)

sockDesc: descripteur de la socket à attacher.
adSock: structure qui contient les éléments de l’adresse externe.
tailleAd: taille en octets de adSock, sizeof(adSock)

 

 

4/ Autres fonctions utiles

A/ struct hostent* gethostbyname(char* nomMachine)

        Cette fonction permet de trouver et de stocker dans une variable de type struct hostent diverses informations sur une machine du réseau I.P. Elle alloue et renvoie l’adresse d’une structure de type struct hostent. On peut ensuite adresser le paquet sur le réseau. Il faut donc un serveur D.N.S. sur le réseau de la machine à interroger pour faire la résolution de nom.

 


    struct hostent
   {
    char* h_name;           /* nom canonique de la machine */
    char** h_aliases;       /* tableau des autres nom d’alias */
    int h_addrtype;         /* domaine de l’adresse*/
    int h_length;           /* longueur de l’adresse */
    char** h_addr_list;     /* tableau des adresses I.P. */
    }


#define h_addr h_addr_list[0]


        Les auteurs de l’A.P.I. socket ont fait ce #define pour accéder directement au premier nom de la machine grâce a la variable h_addr. En effet une machine peut très bien avoir plusieurs noms pour une adresse I.P. 

 

B/ int setsockopt(int sodkDesc, int niveau, int option, 
                  void* valeurOpt,int longValeurOpt)


        Modifie les caractéristiques d’une socket. On peut par exemple, change la taille des tampons, autoriser le broadcast (interdit par défaut). Le paramétrage d’une socket s’effectue sur plusieurs niveau:

- niveau socket (SOL_SOCKET)
- niveau TCP (IPPROTO_TCP)

 

 

 

5/ Fonctions d’arrangement de format

        La représentation des nombres dépend de l’architecture interne des processeurs utilisés. En effet, deux standards sont utilisés et chaque constructeur choisit le sien. Le premier standard est appelé Big Endian et représente les nombre dans l’ordre de lecture. Le little Endian les représente dans l’autre sens.

 

 

Pour transférer des entiers et des longs, il faut donc respecter le standard réseau.

short htons(short nombre) 
long htonl(long nombre) 

Ces fonctions convertissent du format machine local vers le format réseau.

 

 

short ntohs(short nombreRes) 
long ntohl(long nombreRes)

Celles-ci convertissent du format réseau vers le format machine local.

 

        Avant d’émettre un nombre sur le réseau, il faut le convertir au format réseau. Lorsque l’on reçoit un nombre venant du réseau, il faut le convertir au format local de la machine. Des fois, on a une machine qui représente les nombres comme le standard du réseau. Les conversions sont donc inutiles, mais il faut quand même les faire car le programme doit être portable sur d’autres machines.

 

 

Suite...