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
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
I.SOCKETS : RAPPELS
I.1Fonctionnement
On remarquera sur le schéma suivant :
- sin6_port, le numéro de port,
- sin6_addr, le(s) numéro(s) InterNet de la machine, numéro
attribué par l'administrateur système (un par carte Ethernet sur
la machine); on peut par exemple utiliser une adresse unicast globale
(c'est-à-dire valide et visible pour l'ensemble du réseau
mondial) agrégeable contenant un identifiant du réseau sur
64 bits, et un
identifiant unique EUI-64 (construit à partir de l'adresse MAC de la carte
Ethernet, numéro Ethernet unique attribué par le constructeur).
Par exemple : python.ipv6.enst.fr a l'adresse
3ffe:0304:0103:a0:a00:20ff:fe0a:3ff7.
Cette adresse se décompose ainsi :
- 3ffe Adresse de réseau global unicast agrégeable pour le 6Bone
- 03 : G6, partie française du 6Bone
- 04 : G6 - concentrateur Île-de-France
- 0103 : ENST
- a0 : InfRes enseignement-recherche (réseau 160)
- 0a00:20ff:fe0a:3ff7 : identifiant EUI-64 de python.
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é :
- sur une machine différente de celle des clients,
- dans une autre fenêtre, sur la machine courante.
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 :
-
le processus se bloque en select sur stdin et le
(ou les) ports d'entrée lus dans le fichier de configuration,
comme cela est fait dans l'exercice précédent,
-
quand il recoit un message sur un port (ou sur stdin) il le renvoie
vers les sites dont il a lu l'adresse IP et le numéro de port
dans le fichier de configuration,
-
on lancera plusieurs processus dans
des fenêtres se trouvant sur des sites
différents et on initialisera la communication en rentrant un
texte au clavier pour l'un des processus,
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 :
-
l'application va lire dans un fichier de configuration les
numéros de port sur lesquels elle attend et les couples
(adresse-IP, port)
du (ou des) destinataire(s) vers lequel (ou lesquels) elle éet.
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 .