cs_Xentor609
Messages postés258Date d'inscriptionjeudi 20 mars 2003StatutMembreDernière intervention16 août 2004
-
28 juil. 2003 à 17:57
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 2012
-
28 juil. 2003 à 23:52
Bonjour,
j'ai une appli client-serveur et je souhaiterai savoir lorsque'un
client est deconnecte.
Imaginons que le pc client redemarre, ou qu'il se deconnecte d'internet tout simplement.
Je voudrais donc connaitre quand le client se deconnecte,afin qu'il m'avertisse que celui-ci n'est plus la.
Kkun a une idee?
Bye,Xentor609
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 28 juil. 2003 à 18:10
Salut,
Je connais 2 facons.
- avec WSAAsyncSelect; qui va t'envoyer un message avec une notification FD_CLOSE lorsqu'une connection socket est fermée.
- avec les events WSAEventSelect, qui va genere un event FD_CLOSE lorsqu'un socket est fermé.
cs_Xentor609
Messages postés258Date d'inscriptionjeudi 20 mars 2003StatutMembreDernière intervention16 août 2004 28 juil. 2003 à 18:21
Ben ouais, en effet ca m'interesserait bien, si tu avais une de tes sources a me faire parvenir(si ca ne te derange pas ;-)
Sinon, faudra que je cherche dans chaque source utilisant des sockets(ca m'inspire pas vraiment).
Bye,Xentor609
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 28 juil. 2003 à 18:30
Pour le choix de la technique, ca depend de la structure de ton prog (thread ou pas thread).
Perso moi je bosse pas (encore) beaucoup avec les threads, donc je prefere WSAAsyncSelect. J'ai un petit client smtp qui utilise ca, donne ton mail si tu le veux.
Sinon j'ai un exemple de WSASelectEvent qui est assez simple, mais comme c'est un event => ca s'utilise avec des threads (car ca bloque le thread courant).
je te le met ici celui la.
C'est un serveur qui attend la connexion d'un client, et qui affiche "client connecté" quand le client arrive.
Il affiche "connection perdue" lorsque le client s'en va.
Tu compiles, et tu fais un telnet pour tester (open nomdetonordi 2000).
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 28 juil. 2003 à 18:41
je pense quil existe une methode plus efficace... generalement, un serveur, apres avoir ecouter et accepter une connexion, il va faire du recv en boucle, et faire du send en fonction de ce quil a recu...
c'est tres simple, il suffit juste de tester les recv, si a un moment donner le recv == -1 c'est que le client vient de creuver :)
cs_Xentor609
Messages postés258Date d'inscriptionjeudi 20 mars 2003StatutMembreDernière intervention16 août 2004 28 juil. 2003 à 18:46
Ben pas forcement, une erreur peut tres bien survenir lors du recv, sans pour autant que le client ne soit plus la(je pense,non?).
Donc, je reserve le test avec les -1 , pour quitter ma boucle sur recv en general.
Bye,Xentor609
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 28 juil. 2003 à 20:29
tu reserve le -1 comme erreur et pour quitter ta boucle... a ma connaissance il n'existe pas d'autre erreur qu'une deconection de la partie distante...
meme si la machine distante n'est pas morte, un -1 sur recv se resume par une perte de la connexion, donc quoi quil arrive, ca resoue ton probleme
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 28 juil. 2003 à 20:34
???
lol, recv renvoie -1 sur une deconnexion de la partie cliente, je vois pas en quoi les threads on quoi que se soit a voir la dedans, threader ou pas thread, un appel a recv qui renvoie -1 signifie une deco, point final
ou sinon developpe ton idee, je suis curieux de savoir ce que tu en pense :)
cs_Xentor609
Messages postés258Date d'inscriptionjeudi 20 mars 2003StatutMembreDernière intervention16 août 2004 28 juil. 2003 à 20:43
Pas tout a fait, car il arrive lors d'un transfert que le recv(mince, je viens de m'en rendre compte), c'est pas le recv, c'est le send(enfin ca change pas grand chose) me renvoie -1. Ce qui fais, que mon transfert de fichier ne s'est fait pas correctement. Mais c pas pour autant que le client s'est deconnecte(je veux dire qu'il est parti).
Cette erreur vient probablement de mon code, mais je ne trouve pas le prob(ca marche bien 9 fois sur 10, et 1 fois sur 10, le send me renvoie un -1)
Bye,Xentor609
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 28 juil. 2003 à 20:50
send....
on parlais bien de recv il me semble non ? :)
si send a renvoyer -1, c'est que tu send a merder, et donc le recv de la partie distante ne recevra rien, donc recv renvera 0 :)
si par contre ton client se casse, la ton recv distant renvera -1
cs_Xentor609
Messages postés258Date d'inscriptionjeudi 20 mars 2003StatutMembreDernière intervention16 août 2004 28 juil. 2003 à 20:54
ok d'accord, excuse moi je m'etais trompe.C'est bien le send qui est a -1 pas le recv.
Mais bon, je souhaiterai etre averti des le depart (deconnection) d'un client, et pas attendre qu'un recv me renvoye -1 pour en etre sur.
Bye,Xentor609
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 28 juil. 2003 à 21:05
Salut,
Je pensais aux socket bloquants quand j'ai ecrit ca.
Pour moi quand on bosse avec les socket ya 2 solutions(pour les prog simples):
socket bloquants avec thread ou socket non bloquant sans thread. En socket nonbloquant(donc sans thread) recv==-1 ne veut pas forcement dire deco. Voila pourquoi j'ai dit que ca marchait qu'avec thread.
Maintenant je suis loin de tout savoir, et ma vision des socket/threads et de leur utilisation n'est surement pas la meilleure.
N'hesite pas a me faire remarquer mes erreurs quant a ce que j'ai dit au dessus, ce forum est la pour qu'on progresse :).
Pour conclure sur le probleme de Xentor, vu que c'est le sujet, je pense qu'effectivement tester recv==-1 est la solution la plus simple.
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 28 juil. 2003 à 21:12
ne t'excuse pas, je suis pas la pour te pourrire la vie, je suis la pour t'aider :)
sinon, tu souhaite savoir des le debut, bah je vois pas trop trop ce que tu veux faire quoi, puisque des que ton serveur a accepter une requete de connexion, il part immediatement dans une boucle recv (en general)
donc ce que j'ai piger, c'est que en gros, tu veux savoir quand un client a ete deconnecter avant quil se soit connecter ? 0o
cs_Xentor609
Messages postés258Date d'inscriptionjeudi 20 mars 2003StatutMembreDernière intervention16 août 2004 28 juil. 2003 à 21:18
Non, non, tout ce que je souhaite savoir, c le moment ou le client se deconnecte. Imaginons que son pc redemarre subitement, ou qu'il se fait deconencte d'internet pour je ne sais quelle raison. Je souhaiterai donc etre immediatement prevenu que celui-ci n'est plus la.
Et je mon serveur ne reste pas seulement en recv. Il se peut qu'il soit en train de "send" un fichier par exemple au moment ou le client se deconnecte. Or si le send renvoie -1 c pas forcement du au fait que le client s'est deconnecte.
Bon, j'espere avoir ete un petit peu clair, pas sur :-p
Bye,Xentor609
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 28 juil. 2003 à 21:23
oui, je suis obliger de te reprendre sur tes erreurs :)
tu n'as pas du tout compris la notion de bloquant/threads je pense
ces deux termes n'ont rien a voir...
un socket bloquant est bloquant, point, un socket bloquant dans le thread principal bloque le thread principal... un socket bloquant dans un autre thread bloque ce thread, quoi quil arrive
si dans un programme tu lance un nouveau thread et que tu fait un recv bloquant dans ton nouveau thread par exemple, certes ton thread principal continue a tourner... mais ca ne changera jamais le fait que ton nouveau thead qui fait le recv, se trouve bloquer
mnt tu peux faire du multithread avec des file-descriptor non bloquant, rien de t'en empeche
donc voila les thread, c'est une chose, les file-descriptor bloquant ou non, c'en est une tout a fait differente
> En socket non-bloquant (donc sans thread) recv==-1
dire ceci est une grosse erreur, mais je t'en veux pas, promis :)
et en socket non-bloquant, recv -1 signifie forcement une deconnexion distante, et que sa soit en single/multithread et/ou en bloquant/non-bloquant, ca ne change strictement rien, recv -1 signifie que la connexion a ete perdu