Introduction FAQ TD 1 TD 2 TD 3 TD 4 TD 5 TD 6 TD 7 TD 8
Retour au Cours.
Le but des TDs est de réaliser un forum de diffusion de messages. Par la suite, on préfèrera parler d'articles.
Sur le plan technique, nous rappelons trois objectifs principaux.
Le forum se compose de deux programmes distincts.
Le serveur est lancé une fois pour toutes, par l'ingénieur système, lors du démarrage de la machine, pour le compte d'un utilisateur spécial ; vous le lancerez vous-même en phase de test initial, puis vous pourrez faire lancer votre serveur par un collègue.
Le rôle du serveur est de contrôler le stockage des articles. Ceux-ci sont placés dans un répertoire que seul le serveur peut modifier, mais que tous les autres utilisateurs peuvent lire. Chaque article porte un numéro comme nom. Périodiquement (une fois par jour), le serveur lance une expiration, c'est à dire qu'il supprime les articles plus vieux qu'une certaine date (passée en argument du serveur par exemple).
Les fichiers contenant les articles doivent comporter deux parties séparées par une ligne vide. La première est l'en-tête, comprenant l'identité de l'auteur, la date de postage de l'article et le sujet fourni par l'auteur. La deuxième est le message proprement dit.
Par exemple :
From: cohen (Albert Cohen) Date: Mon Jan 12 12:34:00 MET 2007 Subject: Exemple Ce message est un bel exemple d'article, n'est-ce pas ?
Le client est un programme exécuté par les utilisateurs du forum, pour consulter et poster les articles. La consultation s'effectue directement dans le répertoire des articles.
Le client ne doit pas présenter à l'utilisateur des articles qu'il a
déjà lus, c'est à dire que le programme maintient à jour un fichier
~/.forum
avec les numéros d'articles déjà lus par
l'utilisateur.
L'interface utilisateur est simplifiée à l'extrême. Le client doit
présenter la liste des messages (avec leur numéro, leur auteur et les
premiers caractères du sujet) non encore lus à l'utilisateur. Si
l'utilisateur tape un numéro d'article, celui-ci est affiché à l'aide
de l'utilitaire more
(ou de toute autre commande
référencée par la variable d'environnement PAGER
), même
si l'article est déjà lu. Le contenu de l'article doit être fourni à
la commande via son entrée standard. Si l'utilisateur tape la commande
d
suivie d'un numéro d'article, celui-ci est considéré
comme lu. La commande D
marque tous les articles comme
étant lus. La commande l
affiche la liste des articles
non lus.
Avec la commande s <sujet>
, le client appelle
l'éditeur emacs
(ou de toute autre commande référencée
par la variable d'environnement EDITOR
) pour saisir
l'article dans un fichier temporaire dans le répertoire
/tmp
(créé avec mkstemp
). La transmission de
l'article de l'éditeur au client passe par un tube. Une fois l'article
composé, le client demande confirmation avant de poster l'article
réellement.
Pour poster l'article, le client procède de la manière suivante :
tout d'abord, il met en forme l'entête et copie l'article dans un
fichier temporaire dans le répertoire du serveur (créé avec
mkstemp
). Puis, via une file de messages il
envoie le nom du fichier au serveur. Le serveur attribue alors un
numéro à l'article et renomme le fichier temporaire en
conséquence. Vous noterez que le client doit pouvoir écrire dans le
répertoire du serveur, et doit donc avoir les droits de l'utilisateur
propriétaire du serveur.
Dans un deuxième temps, on étendra le forum pour un fonctionnement distribué (plus réaliste), via une prise (socket) réseau, l'article étant alors transmis directement sur le réseau.
L'archive forum.tar.gz
contient les fichiers suivants.
Makefile
: la commande make
compile le
forum ; make clean
nettoie le répertoire du projet.
forum.h
: les paramères du forum.
common.h
: les définitions et déclarations communes
au client et au serveur.
client.h
: les définitions et déclarations
spécifiques au client.
server.h
: les définitions et déclarations
spécifiques au serveur.
common.c
: le code commun au client et au serveur, à
compléter.
client.c
: le code du client, à compléter.
server.c
: le code du client, à compléter.
libforumclient.a
: la bibliothèque (Linux ELF x86)
comportant la "correction" de client.c
.
libforumserver.a
: la biliothèque (Linux ELF x86)
comportant la "correction" de serveur.c
.
À travers 8 sujets de TD, nous allons réaliser les programmes constituant le forum. L'implémentation se fera en langage ISO C90 ou ISO C99, suivant les spécifications ci-dessus.
On prendra soin de rendre ce système robuste, c'est à dire capable de prendre en compte des situations extrêmes, et sûr, c'est à dire que vous expliciterez tous les problèmes de sécurité que vous aurez rencontré.