Fermeture de socket

Résolu
darkkinj Messages postés 18 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 12 mars 2005 - 25 févr. 2005 à 21:24
cs_Stormy Messages postés 255 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 16 janvier 2007 - 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

5 réponses

yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
26 févr. 2005 à 08:52
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
3
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
26 févr. 2005 à 17:55
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).
0
darkkinj Messages postés 18 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 12 mars 2005
26 févr. 2005 à 18:46
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
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
26 févr. 2005 à 18:53
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Stormy Messages postés 255 Date d'inscription samedi 20 avril 2002 Statut Membre Dernière intervention 16 janvier 2007
27 févr. 2005 à 01:36
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.
0
Rejoignez-nous