DOM INF Module AS

1999-2000

TP

Communications entre processus distants

Mise en oeuvre des sockets IPv6

T. Quinot d'ap. B. Dupouy

Note préliminaire :

Les fichiers sources des exemples sont dans : ~domas/sockdir

ATTENTION :
Sur une machine SVR4 (ici, sur Solaris), ajouter a la compilation :
-lsocket (pour les sockets)
-lnsl (pour le résolveur...)

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

dupouy@inf.enst.fr ou à gadret@inf.enst.fr

Le texte du message d'envoi doit contenir la chaîne TPDOM.

SOMMAIRE

  1. I.SOCKETS : RAPPELS
    1. I.1Fonctionnement
  2. II.COMMUNICATION CLIENT/SERVEUR
    1. II.1Code du serveur (serv_fork.c)
    2. II.2Code des clients (cli_fork.c)
  3. III.EXERCICE PREPARATOIRE : UTILISATION DE SELECT
    1. III.1Code à compléter pour le serveur (sel_serv.file)
    2. III.2Code à compléter pour les clients (sel_cli.file)
  4. IV.EXERCICE A RENDRE
    1. IV.1 Fonctionnement de l'application
    2. IV.2 Comment tester l'application

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. Lorqu'une demande est reçue, un processus fils est créé qui prend en charge la gestion de la communication. Le processus serveur se remet en attente de connexions pour pouvoir répondre aux demandes d'autres clients.

Schéma de principe : l'appel système accept permet au serveur de se mettre en attente d'une connexion, en utilisant une socket d'écoute. Lorsqu'une connexion est établie, accept renvoit le numéro d'une nouvelle socket utilisée pour la communication. Le serveur crée un processus fils; le fils n'a plus besoin de la socket d'écoute, il la ferme. Le serveur ferme la socket de communication et se remet en attente de connexion.

Le serveur se libère ainsi de la gestion des communications pour se consacrer à l'écoute des demandes de connexions dont le nombre est limité par listen :

On vous demande de faire tourner les deux programmes suivant 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é :

On utilisera la commande netstat pour suivre les dialogues entre les clients et les serveurs.

II.1 Code du serveur (serv_fork.c)

Cliquez ici pour le consulter

II.2 Code des clients (cli_fork.c)

Le client transmet au serveur les informations qu'on lui a données en utilisant le clavier.
On peut aussi rediriger stdin de toutes les façons possibles :
ls -il | cli_fork
cat *.c | cli_fork
man ls | cli_fork

Cliquez ici pour consulter cli_fork.c

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éails 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és 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éer.

Comment obtenir le(s) port(s) d'entré 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 .