21.03.2013 Views

Rapport du Projet de Chat Basé sur les socket UDP I. But du projet ...

Rapport du Projet de Chat Basé sur les socket UDP I. But du projet ...

Rapport du Projet de Chat Basé sur les socket UDP I. But du projet ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Rapport</strong> <strong>du</strong> <strong>Projet</strong> <strong>de</strong> <strong>Chat</strong> <strong>Basé</strong> <strong>sur</strong> <strong>les</strong> <strong>socket</strong> <strong>UDP</strong><br />

I. <strong>But</strong> <strong>du</strong> <strong>projet</strong>:<br />

• mettre en oeuvre <strong>les</strong> mécanismes <strong>de</strong> diffusion fournis par <strong>les</strong> interfaces <strong>socket</strong>.<br />

• Construire un chat simplifier en utilisant <strong>les</strong> datagramme <strong>UDP</strong> et en utilisant la fonction broadcast.<br />

Pour ce faire nous avons <strong>de</strong>ux fichiers un pour le client et le second pour le serveur.<br />

I. Quelques indications <strong>sur</strong> le mo<strong>de</strong> <strong>de</strong> programmation <strong>du</strong> client et <strong>du</strong> serveur.<br />

• Le co<strong>de</strong> <strong>du</strong> client est multi­threads en effet:<br />

• Un thread écoute en permanence <strong>les</strong> messages venant <strong>du</strong> serveur pour <strong>les</strong> afficher <strong>sur</strong> l'écran <strong>du</strong> client .<br />

• Un thread traite <strong>les</strong> envois <strong>du</strong> nickname et autres types <strong>de</strong> messages.<br />

Pour la nature <strong>de</strong>s messages envoyés on a au début envoyé une structure <strong>de</strong> données qui contenait trois champs un champ<br />

i<strong>de</strong>ntifiant la nature <strong>du</strong> message (<strong>de</strong>man<strong>de</strong> <strong>de</strong> joindre le chat, d'avoir la liste <strong>de</strong>s membres ...) et on a exécuté notre<br />

programme ce cette façon. On a ensuite opté pour un <strong>de</strong>uxième choix qui consiste a envoyer une seule chaîne <strong>de</strong> caractère<br />

pour tous <strong>les</strong> types <strong>de</strong> messages émis et ceci afin d'accroître <strong>les</strong> performances <strong>de</strong> notre chat. Et <strong>du</strong> coté <strong>du</strong> serveur, il y a<br />

traitement <strong>de</strong> la chaîne reçu et reconstitution <strong>de</strong> toutes <strong>les</strong> données nécessaires en connaissant la nature <strong>du</strong> message en<br />

déchiffrant seulement le premier caractère <strong>de</strong> la chaîne .<br />

La première façon était plus facile a programmer mais plus gourman<strong>de</strong> en terme <strong>de</strong> ressources mémoire.<br />

* Pour le stockage <strong>de</strong>s nicknames on a choisi la liste chaînée pour profiter <strong>du</strong> fait qu'on était en C et parce que c'était à notre<br />

avis une élégante façon <strong>de</strong> faire au lieu <strong>de</strong> <strong>les</strong> rentrer dans un fichier ou bien dans un tableau dont on connait pas la taille<br />

d'avance.<br />

• Dans une première étape le serveur avait un seul fil d'exécution. En effet il traitait <strong>les</strong> messages un par un.<br />

Mais l'inconvénient <strong>de</strong> ce type d'architecture c'est que comme on est en <strong>UDP</strong> s'il y a un message qui arrive au serveur<br />

alors que celui ci était en train <strong>de</strong> traiter le le buffer en cours, la perte immédiate <strong>de</strong> ce message s'en suit.<br />

Une <strong>de</strong>s solutions possib<strong>les</strong> et <strong>de</strong> <strong>du</strong>pliquer le serveur (avec <strong>de</strong>s fork ou <strong>de</strong>s threads).On a pensé au début a créer autant <strong>de</strong><br />

fils qu'il y avait <strong>de</strong> client dans notre salon <strong>de</strong> chat mais on s'est vite ren<strong>du</strong> compte que ce serait très gourmand en ressource<br />

en effet si le client n'était pas très actif on lui aurait réservé <strong>de</strong>s ressources qu'il n'était pas entrain d'exploiter efficacement.<br />

Donc une <strong>de</strong>s architectures qu'on a voulu faire était la suivante :<br />

Le programme<br />

principal réceptionne<br />

Un thread qui<br />

qui traite<br />

le message<br />

reçu<br />

Réception <strong>du</strong> message<br />

aussitôt <strong>les</strong> nouveaux<br />

messages


A chaque fois que le serveur reçoit un buffer il crée un thread qui va s'occuper <strong>de</strong> traiter l'information reçu. Ainsi dans le<br />

cas ou le serveur ne reçoit aucun message il y aura un seul fil d'exécution et au dans l'autre cas extrême si tous <strong>les</strong> clients<br />

envoient au même temps il y aura autant <strong>de</strong> threads s'exécutant en parallèle que <strong>de</strong> clients dans le chat.<br />

On a réalisé cette architecture uniquement pour <strong>les</strong> messages que veulent broadcaster <strong>les</strong> client dans le sous réseau car c'est<br />

le message le plus fréquent reçu par le serveur et on optimisera ainsi ce traitement .<br />

Au début pour créer plusieurs fils d'exécution on travaillé avec <strong>de</strong>s fork et on a aussitôt changé pour <strong>les</strong> threads pour<br />

l'unique raison que le fork <strong>du</strong>plique le processus, alors que le thread crée un ensemble d'instructions qui s'exécutent en<br />

parallèle dans le même processus. ce qui nous permettra d'accroître <strong>les</strong> performances.<br />

Mo<strong>de</strong> d'utilisation <strong>de</strong>s fichiers:<br />

Nous disposant <strong>de</strong> <strong>de</strong>ux fichiers c<br />

Compilez <strong>les</strong> fichiers avec make.<br />

Dès que vous lancer le client on vous <strong>de</strong>man<strong>de</strong> <strong>de</strong> rentrer votre nickname. Le serveur vérifie que le nickname n'est pas déjà<br />

existant et établit votre connection au chat. Dans le cas ou le nickname est déjà existant il vous <strong>de</strong>man<strong>de</strong> <strong>de</strong> rentrer a<br />

nouveau un nouveau nickname.<br />

Par la suite vous pouvez chater avec tous <strong>les</strong> client qui sont connectés au serveur est qui se trouvent dans le sous réseau.<br />

Vous disposez <strong>de</strong> <strong>de</strong>ux fonctions en <strong>de</strong>hors <strong>de</strong> celle d'envoi et <strong>de</strong> réception <strong>de</strong> messages.<br />

La première est la fonction chat_list:<br />

cette fonction nous permet <strong>de</strong> visualiser l'ensemble <strong>de</strong>s personnes connectées au serveur.<br />

La secon<strong>de</strong> fonction fournie est chat_leave:<br />

cette fonction nous permet <strong>de</strong> nous déconnecter <strong>du</strong> serveur et <strong>du</strong> coup informera tous <strong>les</strong> clients <strong>du</strong> nickname déconnecté.<br />

I. Les Tests:<br />

Les Test:<br />

Dans cette partie nous allons effectuer différents types <strong>de</strong> tests afin <strong>de</strong> connaître <strong>les</strong> limites <strong>de</strong> notre programme et <strong>de</strong><br />

montrer <strong>les</strong> améliorations qui pourrais y être intégrer.<br />

1. Le fichier client_nick.c:<br />

Pour cette partie nous allons essayer <strong>de</strong> nous connecter au serveur avec plusieurs clients. Pour ce faire nous allons envoyer<br />

au serveur plusieurs Nickname ( Plus <strong>de</strong> 20000) est nous allons constater <strong>les</strong> perte <strong>de</strong> datagrammes et la limite <strong>du</strong> serveur<br />

on constant la saturation <strong>de</strong> ce <strong>de</strong>rnier.<br />

Il suffit pour effectuer ce test <strong>de</strong> compiler le fichier client_nick.c en tapant la comman<strong>de</strong> make. Puis en tapant make<br />

client_nick. Il faut que le serveur soit déjà lancer au auparavant bien évi<strong>de</strong>ment.<br />

Résulats <strong>de</strong>s test:<br />

nous remarquons que le seuil <strong>de</strong> saturation est d'environs 1000 client connecté. Sachant qu'il y a plusieurs requête qui ont<br />

étés ignorer ou pas pris en compte par le serveur.<br />

Exemple:<br />

dans le fichier client_nick.c nous faisons une boucle for pour envoyer 10000 <strong>de</strong>man<strong>de</strong> <strong>de</strong> connections au serveur. Le<br />

serveur sature au bout <strong>de</strong> 4800 <strong>de</strong>man<strong>de</strong> <strong>de</strong> Nickname et le nombre <strong>de</strong> personne qui on effectivement reçus leur nickname<br />

sont <strong>de</strong> l'ordre <strong>de</strong> 1080. Ce qui fait plus <strong>de</strong> 77% <strong>de</strong> tentative <strong>de</strong> connections non réussite.<br />

1. Le fichier client_nick_time.c:<br />

Pour ce test nous allons essayer <strong>de</strong> calculer le temps <strong>de</strong> réponse <strong>du</strong> serveur avec bien<strong>sur</strong> <strong>les</strong> containtes <strong>du</strong> réseau mis a<br />

disposition. Ces résultats peuvent donc varier en fonction <strong>de</strong> ce <strong>de</strong>rnier.<br />

Pour ce faire nous allons utiliser le fichier client_nick_time.c la compilation s'effectue avec la comman<strong>de</strong> make<br />

client_nick_time. Le serveur doit être lancer au auparavant bien évi<strong>de</strong>ment.<br />

Nous allons prendre le temps que mais le système pour effectuer le chat_join.<br />

Nous obtenant le résultat suivant:<br />

Vous pouvez regar<strong>de</strong>r le résultat en tapant la comman<strong>de</strong> gnuplot et puis tapez: « load ''plot.gpl'' »<br />

on remarque dans le graphe que le temps <strong>de</strong> réponse augmente proportionelement au nombre <strong>de</strong> personnes connectées.<br />

Cela s'explique car le serveur doit vérifier l'existence <strong>du</strong> nickname dans le buffer avant <strong>de</strong> l'enregistrer. Plus la taille <strong>du</strong><br />

buffer est gran<strong>de</strong> plus ça prend <strong>de</strong> temps.


• Le fichier client_broad_bombard.c:<br />

Ce test a pour but <strong>de</strong> vérifier la capacité <strong>du</strong> serveur a supporter un envoie massif <strong>de</strong> messages par <strong>les</strong> clients. Pour ce faire<br />

nous envoyons plusieurs messages sans attendre la réponse <strong>du</strong> serveur pour saturer ce <strong>de</strong>rnier.<br />

Résultat <strong>du</strong> test:<br />

Nous avons remarqué qu'il existait <strong>de</strong>ux cas <strong>de</strong> figures. Le premier cas consiste à la saturation pure est simple <strong>du</strong> serveur et<br />

<strong>de</strong> sont arrêt par conséquent. Le <strong>de</strong>uxième cas consiste a l'ignorance d'une gran<strong>de</strong> partie <strong>de</strong>s messages envoyés a ce <strong>de</strong>rnier.<br />

• Le fichier client_broad_temp.c:<br />

Ce test nous permet <strong>de</strong> connaître le temps <strong>de</strong> traitement <strong>du</strong> braodcast d'un message d'un client vers tous <strong>les</strong> autres clients<br />

connectés au serveur et se trouvant dans le sous réseau <strong>de</strong> ce <strong>de</strong>rnier.<br />

Le temps <strong>de</strong> traitement est calculé et s'affiche a l'ecran <strong>du</strong> client: on me<strong>sur</strong>e environ 1500 microsecon<strong>de</strong>s.<br />

• Le fichier client_chat_list.c:<br />

Nous allons entrer 6 personnes dans le chat et nous allons lancer la comman<strong>de</strong> chat_list pour obtenir la liste <strong>de</strong>s connectés<br />

au serveur. Le test me<strong>sur</strong>e le temps temps d'exécution <strong>de</strong> cette comman<strong>de</strong>.<br />

Résultats: on me<strong>sur</strong>e une valeur d'environ 1180 micro­secon<strong>de</strong>.<br />

• Le fichier client_leave_chat_time.c:<br />

Dans ce test nous allons exécuter la comman<strong>de</strong> <strong>du</strong> chat_leave cette <strong>de</strong>rniere enlève une personne <strong>du</strong> tableau <strong>de</strong> nickname et<br />

informe tous <strong>les</strong> client connecté <strong>du</strong> départ <strong>de</strong> la personne <strong>du</strong> chat.<br />

Le temps pris par cette comman<strong>de</strong> est <strong>de</strong> 1093 micro­secon<strong>de</strong>.<br />

Conclusion:<br />

Suite au différents tests que nous avons pu effectuer nous pouvons constater que le serveur ne peut supporter un grand<br />

nombre <strong>de</strong> messages entrant simultanément car cela provoquera soit son plantage pur est simple, soit la perte <strong>de</strong>s messages.<br />

Les temps <strong>de</strong> reponse <strong>de</strong>s différentes fonctions <strong>du</strong> chat reste très correcte pour l'usage <strong>du</strong> chat. Reste a savoir si le résultat<br />

serais le même pour <strong>de</strong>s machines ne se trouvant pas dans le même sous réseau( <strong>sur</strong>ement pas!).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!