Application Client/Serveur de messagerie instantanée reposant sur un protocole applicatif binaire et une architecture réseau IPv6 sous Linux, développée en C dans le cadre de la troisième année de Licence Informatique.
Ce projet met en œuvre des concepts de programmation système et réseau pour permettre la gestion d'utilisateurs, la création de groupes de discussion, l'échange de billets et de réponses, ainsi que la diffusion de notifications en temps réel.
- Architecture Réseau IPv6 et Sockets POSIX : L'ensemble des communications réseau s'appuie sur des sockets IPv6 (
AF_INET6), assurant une compatibilité native avec la pile réseau moderne. - Protocoles Mixtes (TCP / UDP Multicast) :
- TCP (
SOCK_STREAM) : Utilisé pour l'ensemble des requêtes interactives nécessitant de la fiabilité comme l'inscription, la création de groupe, la publication de billets, les réponses, la récupération de l'historique, les requêtes d'invitations et la liste des membres. - UDP Multicast (
SOCK_DGRAM) : Utilisé via l'abonnement aux groupes de multi-diffusion (IPV6_JOIN_GROUP) pour diffuser instantanément les notifications d'activité au sein d'un groupe comme un nouveau billet posté, l'arrivée d'un membre, le départ d'un membre ou la fermeture du groupe. - UDP Unicast : Utilisé pour l'envoi direct de notifications spécifiques à un utilisateur connecté pour la réception d'une invitation ou la notification de consultation de billet.
- TCP (
- Multithreading et Concurrence : Le serveur gère plusieurs connexions clients simultanées de manière asynchrone en attribuant chaque nouveau client accepté à un thread dédié (
pthreads). - Synchronisation et Sécurité Mémoire : L'accès aux structures de données partagées en mémoire centrale par le serveur (table des utilisateurs et état des groupes) est sécurisé par un verrou d'exclusion mutuelle (
pthread_mutex_t) pour éviter les situations de concurrence. - Protocole Applicatif Binaire : Conception et manipulation bas niveau des paquets de données à l'aide de masques binaires et de décalages de bits (bit-shifting) pour optimiser l'encapsulation. La gestion du boutisme (network byte order) est assurée via les fonctions
htonsetntohs.
Le projet est structuré autour des composants suivants :
serveur.c: Contient la boucle principale d'écoute TCP, l'instanciation des threads pour chaque client connecté et la gestion des notifications.client.c: Contient l'interface utilisateur en ligne de commande, l'envoi des requêtes applicatives et la gestion de deux threads d'écoute secondaires pour intercepter les notifications UDP en arrière-plan.protocole.c/protocole.h: Contient les fonctions d'encapsulation, de sérialisation et de désérialisation des structures de données en paquets d'octets ainsi que les routines de lecture et écriture sécuriséesrecv_securiseetsend_securise.Groupe.c/Groupe.hethistorique.c/historique.h: Gèrent respectivement les structures de données internes des canaux de discussion et la persistance temporaire des messages en mémoire.
Une fois l'inscription et la création ou l'adhésion à un groupe complétées au lancement de l'exécutable, les commandes suivantes peuvent être saisies dans l'invite de commande (>) :
/post <id_groupe> <message>: Publie un nouveau billet dans le groupe spécifié./rep <id_groupe> <num_billet> <texte>: Répond à un billet existant au sein d'un groupe./hist <id_groupe> [num_billet] [num_reponse]: Demande au serveur la liste et le contenu des messages ou réponses associés à un groupe./invit: Sans argument, consulte la liste de toutes les invitations en attente reçues pour rejoindre des groupes./invit <id_groupe> <id_user1> <id_user2> ...: Permet à l'administrateur d'un groupe d'inviter un ou plusieurs utilisateurs via leurs identifiants numériques./membres <id_groupe>: Affiche la liste complète des membres appartenant au groupe indiqué./repinvitation <id_groupe> <action>: Répond à une invitation reçue. L'argument<action>prend la valeur1pour accepter,0pour refuser, ou2pour quitter le groupe./quit: Déconnecte proprement le client et ferme l'application.
Le projet intègre un Makefile pour automatiser la génération des fichiers exécutables.
- Compiler l'intégralité du projet :
make
- Lancer le serveur
./serveur
- Lancer le client
./client