DOM INF Module AS

Communications entre processus distants

Mise en oeuvre des sockets

B. Dupouy

Notes préliminaires :

On enverra le(s) fichier(s) source(s) traitant l'exercice et le makefile permettant leur bonne utilisation à :

dupouy@enst ou à gadret@enst
Le texte du champ sujet doit contenir le mot : TPDOM

SOMMAIRE

I.SOCKETS : RAPPELS

I.1Fonctionnement

On remarquera sur le schéma suivant :

II. COMMUNICATION CLIENT/SERVEUR

C'est sur ce type de canevas que l'on construit de nombreuses applications distribuées.

Ici, le serveur se contente d'attendre les demandes des clients distants. La gestion de la communication sera prise en charge par un processus fils, pendant que le serveur se remet en attente de demande de connexions d'autres clients.

Schéma de principe, après fin de l'attente sur accept, le serveur créé un processus fils, ce dernier fermera le socket d'écoute, tandis que le serveur fermera celui de communications :

Le serveur se libère ainsi de la gestion des communications pour se consacrer à l'écoute des demandes de connexions. Le nombre de ces demandes en attente est borné par listen , le nombre de communications en parallèle étant, lui, limité par le nombre de processus que le serveur peut créer :

On vous demande de faire tourner les deux programmes suivants et d'en comprendre le fonctionnement afin de pouvoir mener à son terme l'exercice qui vous est proposé par la suite.

Le serveur sera de préférence lancé :
- sur une machine différente de celle des clients,
- dans une autre fenêtre, sur la machine courante.

On utilisera la commande netstat ou netstat -P tcp -f inet pour suivre les dialogues entre les clients et les serveurs.

Remarques :

II.1 Code du serveur (serv_fork.c)


A faire pour le serveur : Si les bibliothès réseau manquent, ajouter les options suivantes : -lsocket (pour charger la bibliothèque des sockets)
-lnsl (pour charger les utilitaires htons...)
Si le serveur est arrêté et relancé peu de temps après, il ne peut pas reprendre le même port d'écoute. Pour pouvoir réutiliser immédiatement ce port il faut utiliser la fonction setsockopt (après socket et avant bind) :
setsockopt(..., SOL_SOCKET, SO_REUSEADDR, ... , ... )

II.2 Code des clients (cli_fork.c)


A faire pour le client:

A faire :
  1. Faire interroger simultanément le serveur par plusieurs clients situés sur des machines différentes, ceci pour en vérifier le fonctionnement parallèle
  2. Dans l'exemple proposé pour le serveur, le signal SIGCHLD n'est pas géré. La commande ps permettra de voir les zombies résultant de la terminaison des processus créés par le serveur.
  3. Utiliser la commande netstat ou netstat -P tcp -f inet pour tracer les communications entre clients et serveur. Observer les autres communications entrantes et sortantes.

III. EXERCICE PREPARATOIRE : UTILISATION DE SELECT

select permet de se mettre à l'écoute sur plusieurs fichiers simultanément, c'est à dire de multiplexer les entrées-sorties. Nous allons étudier l'écriture d'un serveur utilisant cette fonction.

Utiliser la commande :
man -s 3c select
pour avoir les détails du fonctionnement de select.

Pour comprendre le mécanisme de cet appel système, on vous demande de compléter le code du client et du serveur dont on donne les squelettes ci-dessous.

On créera de nombreux processus clients pour constater le bon fonctionnement du serveur.

III.1 Code à compléter pour le serveur (sel_serv.file)

Cliquez ici pour consulter sel_serv.file

III.2 Code à compléter pour les clients (sel_cli.file)

Cliquez ici pour consulter sel_cli.file

IV. EXERCICE A RENDRE

IV.1 Fonctionnement de l'application

Il s'agit d'écrire le code d'une application qui attend des données sur stdin et sur au moins un port en UDP ou en TCP. Cette application renvoie tout ce qu'elle recoit vers un (ou plusieurs) destinataire(s).

Fonctionnement de l'application :

On donne le canevas du code dans lequel il vous faudra compléter les parties manquantes, c'est à dire la mise en place du select et les fonctions de lecture et d'écriture sur les ports. Pour ce faire, on utilisera les exemples précédents.
Cliquez ici pour récupérer le fichier à compléter.

Comment obtenir le(s) port(s) d'entrée et l'(es) adresse(s) des destinataires :

Par exemple, pour construire un anneau entre M1, M2 et M3, on peut donner les fichiers de configuration suivants :
===Pour le processus qui s'exécute sur M1 :
  sortie M3   UDP 30287
  entree **** TCP 54678
===Pour le processus qui s'exécute sur M2 :
  sortie M1   TCP 54678
  entree **** UDP 48521
===Pour le processus qui s'exécute sur M3 :
  sortie M2   UDP 48521
  entree **** UDP 30287

IV.2 Comment tester l'application

Que devez-vous faire pour tester votre programme ?
Il faudra construire un anneau en faisant tourner votre programme sur au moins trois machines différentes.
Pour obtenir un exemple de trois fichiers de configuration, cliquez ici .

©(Copyright) dupouy at telecom-paristech.fr