Debian logo [inetdoc.LINUX]

2. Contexte de développement

L'objectif de développement étant l'initiation, on se limite à un code minimaliste.

Le programme client, udp-client.cc

... demande à l'utilisateur de saisir une chaîne de caractères et l'envoie au serveur.

Le programme serveur, udp-server.cc

... transforme les caractères de cette chaîne en majuscules et renvoie le résultat au client.

2.1. Système d'exploitation

Le schéma ci-dessous positionne les couches de la modélisation des communications réseau vis-à-vis du système d'exploitation.

Les pilotes de périphériques et les protocoles implantés depuis la couche physique jusqu'à la couche transport font partie du sous-système réseau du noyau du système d'exploitation.

Le programme utilisateur est lancé à partir de la couche Shell et est exécuté au niveau application.

L'utilisation de socket revient à ouvrir un canal de communication entre la couche application et la couche transport. La programmation des sockets se fait à l'aide de bibliothèques standard présentées ci-après : Section 2.4, « Bibliothèques utilisées ».

2.2. Instructions de compilation

Ces deux programmes sont compilables en l'état sur n'importe quelle boîte Linux. Il suffit d'appeler le compilateur C++ de la chaîne de développement GNU en désignant le nom du programme exécutable avec l'option -o.

phil@nowhere:~/cpp/socket$ g++ -o udp-client udp-client.cc
phil@nowhere:~/cpp/socket$ g++ -o udp-server udp-server.cc
phil@nowhere:~/cpp/socket$ ll
total 52K
drwxr-xr-x  2 phil phil 4,0K 2005-06-16 22:45 .
drwxr-xr-x  3 phil phil 4,0K 2005-06-16 22:43 ..
-rwxr-xr-x  1 phil phil  17K 2005-06-16 22:43 udp-client
-rw-r--r--  1 phil phil 3,8K 2005-02-02 04:05 udp-client.cc
-rwxr-xr-x  1 phil phil  16K 2005-06-16 22:45 udp-server
-rw-r--r--  1 phil phil 2,7K 2005-02-02 04:05 udp-server.cc

2.3. Instructions d'exécution

L'exécution du programme est aussi assez triviale. On peut exécuter le client et le serveur sur le même hôte dans deux Shells distincts et utiliser l'interface de boucle locale pour les communications réseau.

Le programme serveur, udp-server.cc
phil@nowhere:~/cpp/socket$ ./udp-server
Enter port number to listen on (between 1500 and 65000): 4000
Waiting for request on port 4000
  from 127.0.0.1:4968
  Received: texte de test
Le programme client, udp-client.cc
phil@nowhere:~/cpp/socket$ ./udp-client
Enter server host name or IP address: 127.0.0.1
Enter server port number: 4000

Enter some lines, and the server will modify them and
send them back.  When you are done, enter a line with
just a dot, and nothing else.
If a line is more than 100 characters, then
only the first 100 characters will be used.

Input: texte de test
Modified: TEXTE DE TEST
Input: .

2.4. Bibliothèques utilisées

Les deux programmes utilisent les mêmes fonctions disponibles à partir des bibliothèques standards.

libc6-dev, netdb.h

Opérations sur les bases de données réseau. Ici, c'est la fonction gethostbyname() qui est utilisée. Elle renvoie une structure de type hostent pour l'hôte name. La chaîne name est soit un nom d'hôte, soit une adresse IPv4 en notation pointée standard, soit une adresse IPv6 avec la notation points-virgules et points. Pour obtenir plus d'informations, il faut consulter les pages de manuels : man gethostbyname.

libc6-dev, netinet/in.h

Famille du protocole Internet. Ici, plusieurs fonctions sont utilisées à partir du paramètre de description de socket sockaddr_in. Les quatre fonctions importantes traitent de la conversion des nombres représentés suivant l'hôte (bit le moins significatif en premier sur processeur Intel x86) ou les définitions des en-têtes réseau (bit le plus significatif en premier).

  • htonl() et htons() : conversion d'un entier long et d'un entier court depuis la représentation hôte (bit le moins significatif en premier ou Least Significant Byte First) vers la représentation réseau standard (bit le plus significatif en premier ou Most Significant Byte First).

  • ntohl() et ntohs() : fonctions opposées aux précédentes. conversion de la représentation réseau vers la représentation hôte.

libstdc++6-dev, iostream

Opérations sur les flux d'entrées/sorties de base tels que l'écran et le clavier. Ici, toutes les opérations de saisie de nom d'hôte, d'adresse IP, de numéro de port ou de texte sont gérées à l'aide des fonctions usuelles du langage C++. Ces fonctions sont les seules qui soient spécifiques au langage C++.

D'une manière générale, toutes les fonctions sont documentées à l'aide des pages de manuels Unix classiques. Soit on entre directement à la console une commande du type : man inet_ntoa, soit on utilise l'aide du gestionnaire graphique pour accéder aux mêmes informations en saisissant une URL du type suivant à partir du gestionnaire de fichiers : man:/inet_ntoa.

2.5. Choix du protocole de transport

Au dessus du protocole de couche réseau IP, on doit choisir entre deux protocoles de couche transport : TCP ou UDP.

Le protocole TCP est le premier protocole développé. Il «porte la moitié» de la philosophie du modèle Internet. Cette philosophie veut que la couche transport soit le lieu de la fiabilisation des communications. Ce protocole fonctionne donc en mode connecté et contient tout les outils nécessaires à l'établissemnt, au maintien et à la libération de connexion. De plus, des numéros de séquences garantissent l'intégrité de la transmission et le fenêtrage de ces numéros de séquences assure un contrôle de congestion. Tout ces mécanismes ne sont pas évidents à maîtriser pour un public débutant.

Le protocole UDP a été développé après TCP. La philosophie de ce mode de transport suppose que le réseau de communication est intrinséquement fiable et qu'il n'est pas nécessaire de garantir l'intégrité des transmissions et de contrôler la congestion. On dit que le protocole UDP n'est pas orienté connexion ; ce qui a pour conséquence d'alléger considérablement les mécanismes de transport.

L'objectif du présent document étant d'initier à l'utilisation des sockets, on s'appuie sur le protocole de transport le plus simple : UDP. En termes de développement, les différences de mise en oeuvre des sockets sont minimes. C'est à l'analyse réseau que la différence se fait. UDP est plus facile à utiliser avec un public débutant.

Pour plus d'informations, consulter le support Modélisations réseau.

2.6. Sockets & protocole de transport UDP

Le schéma ci-dessous présente les sous-programmes sélectionnés côté client et côté serveur pour la mise en œuvre des sockets avec le protocole de transport UDP.

Les appels de sous-programmes avec les passages de paramètres sont détaillés dans les sections suivantes.