Université Pierre et Marie Curie Master 2016 2017
PR : Travaux sur Machine 7. Une messagerie instantanée en mémoire partagée

Cette séance consiste à écrire une petite application de messagerie instantanée, permettant à plusieurs utilisateurs d’une même machine d’échanger de petits messages sous forme de texte via le terminal. Le premier exercice consiste à écrire un client, le deuxième le serveur. Les indications qui vous sont données ne précisent pas les besoins en synchronisation, qui sont le principal problème à résoudre. Vous utiliserez des sémaphores pour que l’application s’exécute correctement.

On trouvera en annexe le fichier chat_common.h qui fournit quelques structures de données utiles, ainsi que les inclusions indispensables. On trouvera également le Makefile, dont le paramètre LFLAGS devra éventuellement être complété par -lpthread -lrt.



1 Un serveur de messagerie instantanée

Le serveur est appelé avec en ligne de commande l’identifiant par lequel il sera connu de tous les clients. Au lancement, le programme serveur crée un segment de mémoire partagée dont le nom est son identifiant. Le serveur lit ensuite les requêtes de ses clients dans ce segment. Les requêtes auront toutes le même format décrit dans le ".h" fourni en annexe, savoir

struct message {
   long type;
   char content[1024];
}

Lorsqu’il traite une requête de connexion, le serveur mémorise l’identifiant du client dans un tableau. Une requête de déconnexion amène le serveur à ôter le client de ce tableau. Pour pouvoir diffuser des informations vers ses clients, le serveur utilise des segments de mémoire partagée créés par ces derniers.

Exemple d'appel :
bin/chat_server semserver &
Fichier à créer : src/chat_server.c

2 Un client de messagerie instantanée

Le client de messagerie instantanée doit d’abord créer deux segments de mémoire partagées, à l’aide de shm_open, permettant de dialoguer avec le serveur, un pour l’émission et l’autre pour la réception. Il prend en ligne de commande les deux identifiants à donner aux deux appels à cette fonction.

Ensuite, il permet l’accès en lecture-écriture à ces segments à l’aide de la fonction mmap.

Enfin, il lance deux Threads :

A son initialisation, le client aura aussi installé un gestionnaire du signal ^C afin de permettre à l’utilisateur de terminer le programme proprement, notamment pour libérer les ressources partagées.

Exemple d'appel :
bin/chat_client semclient semserver
Fichier à créer : src/chat_client.c

3 Annexes


makefile

chat_common.h
Format de l'envoi : src/chat_client.c
Répertoires autorisés : src/chat_server.c