TP Systèmes Répartis


Notes préalables

ATTENTION
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.
TRANSPARENTS
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.

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: 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:

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.
Question 1 (1 point)
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.
Question 2 (2 points)
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.
Question 3 (1 point)
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.
Question 4 (1 point)
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.
Question 5 (2 points)
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.
Question 6 (2 points)
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é.
Question 7 (1 point)
Comment se comporte le modèle actuel si deux utilisateurs du même nom s'enregistrent successivement? Détailler les différents cas.
Question 8 (2 points)
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é.
Question 9 (1 point)
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

Question 10 (2 points)
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

Question 11 (2 points)
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.
Question 12 (2 points)
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.
Question 13 (1 point)
Faîtes répondre le robot en répartissant les probabilités: 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