Fermeture de socket [Résolu]

darkkinj 18 Messages postés samedi 6 novembre 2004Date d'inscription 12 mars 2005 Dernière intervention - 25 févr. 2005 à 21:24 - Dernière réponse : cs_Stormy 255 Messages postés samedi 20 avril 2002Date d'inscription 16 janvier 2007 Dernière intervention
- 27 févr. 2005 à 01:36
Je me trouve face à un problème de protection pour mon application serveur. Le serveur est sur un thread correspondant à un client en boucle (quasi)infinie qui gère la sortie normale pour la fermeture de socket.
J'ai trouver comme solution que si le client n'envoie rien 3 fois il est déconnecté. Dans ce cas si le client est tué, le serveur lit sur une socket où il n'y a rien et au bout de trois fois déconnecte.
J'aurais voulu savoir si c'est une bonne méthode ou si je me trompe totalement et que normalement je devrai faire autre chose. voici le code de traitement client:

DWORD WINAPI TraitementClient(LPVOID lpParam){
cout << "dans le thread" << endl;
char buffer[1024];
char commande[8];
char arg[1024];
int essai=0;
strcpy(buffer,"");
Client* client=(Client*)(lpParam);
SOCKET socket=client->GetSocket();
cout << "socket : " << socket << endl;
while (strcmp(buffer,"#!exit")!=0 && essai!=3){
strcpy(buffer,"\0");
strcpy(commande,"\0");
recv(socket,buffer,sizeof(buffer),0);
sscanf(buffer,"%s",commande);
cout << "dans le buffer" << buffer << endl;
if (strcmp(commande,"#!say")==0){
strcpy(arg,&buffer[strlen(commande)+1]);
cout << arg << endl;
essai=0;
strcpy(buffer,"");
strcat(buffer,&(client->Getname())[0]);
strcat(buffer," a dit: ");
strcat(buffer,arg);
cat.Diffuser(buffer);


}
if (strcmp(buffer,"\0")==0){
cout << "rien dans le buffer";
essai++;
}
}
return 0;
}

merci d'avance...
darkkinj
http://www.kinj.fr.st
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
yoyo269 1403 Messages postés lundi 23 février 2004Date d'inscription 11 janvier 2009 Dernière intervention - 26 févr. 2005 à 08:52
3
Merci
Salut darkkinj,

pour moi t'as solution me semble plutôt bonne, mais vaut mieux demander à qq'un qui s'y connait pas mal dans le réseau et internet, comme par exemple Aardman.
T'as qu'à lui envoyer un mail pour qu'il regarde sur le forum.
Il saura sûrement te répondre ou au moins son avis qui ne pourra être que pertinant.

YOYO, @+.
YOYO

Merci yoyo269 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de yoyo269
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 26 févr. 2005 à 17:55
0
Merci
Salut,
Perso j'ai pas bien compris..
Tu déconnectes un client si il n'envoies rien pendant 3 fois ? mais comment tu sais qu'il n'a rien envoyé, puisque tu n'a rien recu ?
Je pense qu'il vaudrait mieux faire un systeme de timeout non ? (si le client ne fait rien pendant 1 minute => déco).
Commenter la réponse de cs_aardman
darkkinj 18 Messages postés samedi 6 novembre 2004Date d'inscription 12 mars 2005 Dernière intervention - 26 févr. 2005 à 18:46
0
Merci
ben le truc c'est que si je tur le processus client ( via ctrl+alt+suppr), le serveur reçoit lui plein de message vides en fait, la socket n'est pas fermée mais il n'y a plus personne de l'autre côté. J'aurai voulu essayer de tester si un client était toujours présent mais vu ke le serveur reçoit tant de message vide ce n'est pas faisable. Vu que apparemment il n'y a pas d'autres solutions je vais accepter la première réponse.

darkkinj
http://www.kinj.fr.st
Commenter la réponse de darkkinj
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 26 févr. 2005 à 18:53
0
Merci
Salut,
Je comprend pas l'expression: "recevoir un message vide".
Un moyen de savoir quand un client se déco c'est de regarder la valeur de retour du recv():
Si c'est SOCKET_ERROR ou 0, tu peux considerer que la connexion est perdue.
Commenter la réponse de cs_aardman
cs_Stormy 255 Messages postés samedi 20 avril 2002Date d'inscription 16 janvier 2007 Dernière intervention - 27 févr. 2005 à 01:36
0
Merci
Pour tu n'essaie pas avec cette fonction:
WaitForSingleObject( pi.hProcess, INFINITE );

Si ton client 'meurt' (selon ton expression), tu engage un processus adéquat.
Commenter la réponse de cs_Stormy

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.