!recv ou SOCKET_ERROR

Résolu
Signaler
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
-
Messages postés
4
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
5 septembre 2006
-
Bonjour,

J'ai lu sur msdn et un peu partt ke lon pouvait reconnaitre la deconnexion d'un client si recv renvoyait 0, mais lorsk je fais par exemple ceci :

while (recv(...)) {}

Malgré le fait que le client se soit deconnecté, ca boucle tjrs et ca me renvoie -1 (== SOCKET_ERROR).
Je ferme la connexion du client en faisant appel a closesocket(), ya til une fonction ke j'ai oublié ? J'ai essayé avec shutdown et closesocket(), mais j'ai tjrs le mm pb.
Si kelkun a une solution, merci bcp ;)

Merci d'avance

++

6 réponses

Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
"If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError."

Donc, appelle shutdown avec SD_BOTH avant ton closesocket. Et teste donc recv > 0, quitte à utiliser une variable temporaire (genre while((i=recv) > 0), çà t'évitera de boucler bêtement si le client plante) pour tester à la sortie de la boucle ce qui s'est passé.
Messages postés
170
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
9 juillet 2008

le plus simple pour savoir quand un client se déconnect est d'attendre le FD_CLOSE
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Oui, mais pour le recevoir ce FD_CLOSE il faut utiliser un modele un peu plus évolué..
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Merci Nebula, mais alors pkoi recv ne me renvoie pas 0 ? Paske le client a planté ? J'ai po bien compris la..

Merci encore a tous

++
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Ben,
0 = connexion fermée "amicalement" (avec appel à shutdown avant)
-1 = connexion plantée ou fermée à l'arrache, et WSAGetLastError() te permet d'en savoir plus sur ce qui s'est passé
Messages postés
4
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
5 septembre 2006

J'envoie un message un bon moment après la fin du post mais bon j'essaye quand même ...

l'équivalent du WSAGetLastError() sous Linux c'est quoi ? Parce que je voudrais moi aussi connaitre la déconnexion brutale, mais sous linux ...