TP Systèmes Répartis
Notes préalables
Il est primordial de vérifier que vous avez
correctement rendu votre TP, qui est à faire
individuellement.
Un TP reçu incorrectement est un TP non reçu.
Les transparents du cours sont disponibles en suivant
ce lien.
Utilisez le bouton du milieu sous Netscape pour l'ouvrir dans une
autre fenêtre.
- Pour pouvoir compiler le TP, vous devez
impérativement mettre, en tête de votre PATH, le chemin
/usr/local/packages/gnat/bin
Pour cela, taper la ligne:
PATH=/usr/local/packages/gnat/bin:$PATH
- Pour décompresser les sources du
TP dans le répertoire TP3, tapez la commande:
gtar zxvf
tp-dsa.tar.gz
- Les réponses textuelles aux questions 1, 3, 4 et 7 doivent
être écrites dans le fichier appelé NOTES qui se trouve
dans le même répertoire que les sources du TP
- Pour la remise automatique de votre TP:
Créez un nouveau répertoire vide du nom de ds-sol dans le
répertoire parent de tp-dsa.
Copiez dans ds-sol
- tous les fichiers *.ads *.adb *.cfg ainsi que NOTES
dans ds-sol. En supposant que vous êtes dans le répertoire
parent de tp-dsa, faites
cp tp-dsa/*.ads tp-dsa/*.adb tp-dsa/*.cfg tp-dsa/NOTES ds-sol
- ne pas copier de fichier objet ou exécutable
En supposant que vous êtes dans le répertoire parent de
ds-sol executez les commandes suivantes:
tar cf ds-sol.tar ds-sol
gzip ds-sol.tar
uuencode ds-sol.tar.gz ds-sol.tar.gz > uu.txt
cat uu.txt | Mail -s tp-dsa pautet@enst.fr
Prenez garde à ce que la commande Mail prenne une
majuscule.
Structure globale
But du programme
Le programme qui vous est proposé ici permet
d'envoyer des messages courts sur un BBS (Bulletin Board
Service). Chaque message posté par un utilisateur peut être lu par
tous les autres, qui peuvent, à leur tour, poster une réponse ou un
nouveau message.
Découpage en modules
La structure initiale du programme est la suivante:
- La partition serverp représente le serveur, qui enregistre
les messages et les redistribue à qui les demande.
- La partition simplep implémente un client simple, qui se
connecte au serveur et effectue des requêtes simples.
Les appels entre le client et le serveur se font par l'intermédiaire
du paquetage Server, qui possède en
tête du fichier une directive de compilation pragma
Remote_Call_Interface, indiquant qu'il peut être appelé à distance.
Un exemple de client simple est donné dans l'unité
Simple.
Compilation du programme
Fichier de configuration
Le fichier de configuration bbs.cfg sera lu par le
programme gnatdist pour produire les différentes partitions du
programme distribué.
Pour compiler ces partitions en utilisant le fichier de configuration,
taper:
gnatdist -v -g -O2 bbs.cfg
Les paramètres de la ligne de commande sont:
- -v (verbose execution) (optionnel) Indique les
différentes étapes effectuées par gnatdist lors de la
compilation du programme distribué
- -g (include debug symbols) (optionnel) Génère des
symboles permettant le debuggage du programme avec un debugger tel
que gdb ou ddd
- -O2 (optimize) (optionnel) Optimise le code de
manière raisonnable, mais pas trop coûteuse en termes de temps de
compilation
- bbs.cfg (obligatoire) Nom du fichier contenant la
description de l'application distribuée
Lancement du serveur
Le fichier de configuration stipule que le serveur se trouvera sur le
port 4161 de la machine courante (localhost), et que le protocole TCP
sera utilisé.
Le serveur se lance en tapant
./serverp
dans une fenêtre de la machine locale. Il affichera un message de
bienvenue, et se mettra en attente des requêtes.
Pour lancer un client sur la même machine, il faut taper
./simplep
(notez que ceci donnera un message qui décrit la syntaxe à utiliser
pour le client, il manque ici des paramètres sur la ligne de commande)
Questions
Compréhension du client simple
Dans un premier temps, essayer, sur la machine locale, d'utiliser le
client pour poster et enlever des messages.
Expliquez, en une trentaine de lignes
maximum, comment fait le client pour poster des messages et récupérer
les messages existants. Indiquez notamment où sont stockés les
messages, et les noms des différentes entités (partitions et
programmes principaux).
Notes: le fichier de configuration bbs.cfg indique que le
client pourra trouver le serveur sur la machine
localhost. Ce nom magique désigne toujours la machine
locale, et permet de ne pas coder en dur un nom
d'ordinateur. Pour cette raison, il est important de lancer le
client et le serveur sur l'ordinateur sur lequel vous vous
trouvez, et pas sur un autre.
Sans modifier le code du serveur, étendez le
programme client pour qu'il accepte la syntaxe `simplep read
n' qui renverra les n derniers messages postés (ou
moins s'il n'en existe pas autant).
Notes: cette nouvelle fonctionalité ne doit pas rendre la
commande read sans paramètres indisponible! Celle-ci
doit toujours afficher tous les messages.
Vous voulez maintenant pouvoir lancer vos clients sur des
machines différentes. Que vous faut-il changer pour que les
clients soient capables de trouver le serveur sur une machine
spécifique?
Notes: ne faîtes pas le changement, documentez le dans le
fichier NOTES uniquement.
Utilisation d'un client plus élaboré
L'utilisation du client simple est pénible, en cela qu'il faut se
connecter régulièrement pour lire les nouveaux messages.
Un nouveau client a donc été fabriqué dans la partition
evolutedp. Ce client utilise un objet distribué, en fait un
pointeur de type Penpal_Pointer défini dans le paquetage
Server, pointant sur un objet de type
Penpal_Type, défini dans le paquetage
Common.
On rappelle que Penpal signifie Correspondant en
anglais.
Quelles sont les opérations pouvant être invoquées sur un objet de
type pointeur sur objet distant Penpal_Pointer?
Notes: on souhaite ici la liste des opérations pouvant être
invoquées à distance sur une référence sur un correspondant,
pas les opérations ne concernant que le type Penpal_Pointer
lui-même.
Rajouter une commande `broadcast' au
programme `evolutedp' permettant d'envoyer un message à tous les
utilisateurs enregistrés sans laisser de trace sur le BBS.
Notes: cette commande doit être rajoutée dans le menu
interactif, ainsi que l'aide associée. "Sans laisser de trace
sur le BBS" signifie qu'un client utilisant la commande `read'
ne pourra pas récupérer ces messages par la suite. Ce sont des
messages instantanés.
Rajouter une commande `page' au programme
`evolutedp' permettant d'envoyer un message à un utilisateur donné
s'il est enregistré à ce moment là.
Attention à bien rattraper
l'exception `System.RPC.Communication_Error' au cas où l'utilisateur
se soit déconnecté.
Comment se comporte le modèle actuel si deux utilisateurs du même
nom s'enregistrent successivement? Détailler les différents
cas.
Modifier le programme pour qu'en cas de
conflit de nom, l'enregistrement du deuxième utilisateur lève
l'exception `Sender_Error' (définie dans le paquetage
Exceptions)
UNIQUEMENT
lorsque l'utilisateur du même nom est encore connecté.
Modifier la déclaration du serveur de telle
manière qu'un client effectuant un Broadcast ne reste pas bloqué
pendant l'opération.
Notes: ceci est légitime, étant donné qu'un Broadcast ne
renvoie pas de résultat, il est inutile d'attendre la fin de
l'opération.
Ajout d'un service d'administration du BBS
Implémenter un nouveau service, dans une partition `adminp',
permettant de donner la liste des personnes actuellement
connectées au serveur et d'effacer la liste des messages. Cela
nécessitera probablement la modification du package server. Ne
pas oublier de mettre à jour le fichier de configuration afin
de générer cette nouvelle partition.
Notes: on souhaite bien obtenir la liste des clients
ACTUELLEMENT CONNECTES, et non pas celle des
pseudonymes ayant existé à un moment donné.
Ajout d'un robot répondeur
Créer un robot (programme autonome, ne nécessitant pas
d'entrée au clavier de la part de l'utilisateur) qui,
lorsqu'il reçoit un message, répond à l'émetteur en lui disant
qu'il a bien reçu son message après un délai de 5 secondes.
Notes: si vous connectez plusieurs robots ensemble, attention
à ce qu'ils ne se parlent pas trop vite et saturent le réseau!
L'instruction en Ada pour attendre 5 secondes est delay 5.0.
Améliorer le robot pour qu'il vérifie avant dans la liste des
messages qui ont été postés sur le BBS si le message qu'il a
reçu est un message persistent ou pas. Si c'est le cas, il
répondra à tout le monde en utilisant un Broadcast, sinon il
ne répondra qu'à l'émetteur.
Faîtes répondre le robot en répartissant les probabilités:
- 25% de probabilité de ne pas répondre;
- 25% de probabilité de répondre en privé;
- 25% de probabilité de répondre en broadcast;
- 25% de probabilité de répondre en public.
Cependant, le robot ne devra jamais répondre en public à un
message privé, ni de manière persistente à un message non
persistent, un nouveau tirage devra avoir lieu.
Notes: le paquetage `Ada.Numerics.Discrete_Random' peut être
instancié avec un type discret comme argument (un type énuméré
par exemple), et exporte alors ensuite un type `Generator'
possédant une fonction `Random' qui renverra au hasard un des
objets du type.
Laurent Pautet
Last modified: Tue Jun 27 23:16:40 CEST 2000