Chat client/serveur avec wsaevent en console

Soyez le premier à donner votre avis sur cette source.

Vue 6 256 fois - Téléchargée 615 fois

Description

Voila "ma" petite production sur les WSAEvent...
c'est un code en cpp avec des classes qui permet la réalisation
d'un chat en mode console à 2 (1 client, et 1 serveur).
Dans ce cas bien sur la gestion des socket avec WSAEvent n'est
pas nécessaire, mais comme m'application est assez simple c'est
assez pratique pour apprendre. Si vous voulez dialoguer à plusieurs,
il suffit de changer une var (EventTotal), cependant, le serveur ne repondra
qu'au dernier client connecté mais recevra les msg de tous les
autres clients.

Cette source a encore besoin d'être améliorée et je le ferai avec vos
commentaires si vous voulez bien m'en laisser.

Merci beaucoup Aardman qui m'a plus que conseillé pour la prog WSAEvent.

ps:
evidemment comme on est en mode console ben si on recoit qqch pendant
que l'on ecrit ---> probleme.

Source / Exemple :


tout est dans le zip

Conclusion :


Donc ici c'est les remerciements donc dans mon cas merci Aardman comme je l'ai deja dit.
Bug connus:
1-(c'est pas vraiment un bug) mais j'utilise la fonction TerminateThread ce qui est mauvais car elle ne libère pas la memoire allouée (bon ici du coup j'ai fait exprès de pas en allouer mais j crois que c mal d'utiliser cette fction :p)
2-la synchro des threads est bourrin et n'est pas parfaite à mon avis
3-ben c'est un mode console et je ne protege pas l'acces à la console donc si on recoit qqch pdt que l'on ecrit et bien on perd tt ce qui etait deja ecrit...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Spiffou
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
-
ben en fait la file d'attente, comme son nom l'indique, permet d'autoriser un certain nb de connexion en attente.
en gros sur ce programme, une variable limite le nb d'utilisateur à 2. du coup lorsque 2 personnes sont connectées (le client + le serveur) plus personne ne peut se connecter.

la file d'attente permet à d'autres clients potentiels de se mettre en attente de connexion, cad que le serveur prendra leur connexion dès que le client en cours se sera déconnecté.
si la file d'attente est pleine, alors le client ne peut pas se connecter et sa fonction connect retourne....

par contre il est clair que les wsaevent sont inutiles et tres compliqués pour ce que j'en fait dans ce prog, mais c'etait juste pour apprendre.

pour ton prog de chat, tu pourra surement bcp l'améliorer si tu utilises des threads ou si tu utilises les mfc.
en effet, je ne protege pas l'accès à la console, donc si on recoit qqch pdt que l'on ecrit, les données sont perdues. avec les mfc, c'est plus facile de gérer ce genre de pb (grace aux champs de textes).


voila j'espère que j'ai été clair, si y'a un gosu du reseau qui voit que j'ai dit une betise, qu'il n'hésite surtout pas, mais bon ca devrait aller en principe...
lilington
Messages postés
158
Date d'inscription
samedi 31 janvier 2004
Statut
Membre
Dernière intervention
12 mars 2009
-
Salut je débute un peut dans la programmation reseaux.J'aimerai savoir à quoi sert la file d'attente de 5
en fait j'ai globalemant compris ce qui ce passe mais dans les détaille je pige pas trop.j'ai fait moi même un petit programme de chat mais il fonctionne comme un talkywalky i.e le client parle et le server attend de recevoir avant de pouvoir parler à son tour et vise versa. j'ai donc été interressé par ta source mais je ne vois pas trop comment fair pour mon prog à moi.
sinon c'est pas mal
Spiffou
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
-
j'ai fait une correction:
comme je peux pas retirer les case du tableau puisqu'il est statique, je décale à la fin les cases event et socket (en mm tps pour pas perdre l'ordre) à '0' (correspondant aux connexions fermées). comme ca si on a plus de 2 connexions, la fonction devrait bien marcher...

void CReseau::CompressArray()
{
SOCKET temps;
WSAEVENT tempe;
int i;

for (i=0; i<EventTotal+1; i++)
{
if ( SocketArray[i] == 0 && EventArray[i] == 0)
{
temps = SocketArray[EventTotal];
SocketArray[EventTotal] = SocketArray[i];
SocketArray[i] = temps;

tempe = EventArray[EventTotal];
EventArray[EventTotal] = EventArray[i];
EventArray[i] = tempe;
}
}
}



sinon aucun commentaire sur le code ou la gestion de threads??
Spiffou
Messages postés
100
Date d'inscription
jeudi 1 avril 2004
Statut
Membre
Dernière intervention
9 juin 2014
-
en effet.
par contre dans ce cas precis ca marche puisque le nb d'utilisateur est limité à 2.
bon je recorrige...

merci.
cs_aardman
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2 -
Salut,
La fonction CompressArray est sencée enlever toutes les cases des 2 tableaux qui sont a zéro!
il ne faut surtout pas ranger ces tableaux par ordre décroissant! car tu melanges les index des events et des sockets.
EventArray[i] ne correspondra plus au socket SocketArray[i] apres un appel a CompressArray()...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.