Deconnection d'un client

cs_Xentor609 Messages postés 258 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 16 août 2004 - 28 juil. 2003 à 17:57
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 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

30 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
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é.
0
cs_Xentor609 Messages postés 258 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 16 août 2004
28 juil. 2003 à 18:14
Ok, merci!
Et est-ce que tu saurais si y'a une (des?)sources interessantes qui utilisent une de ces methodes?
Bye,Xentor609
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 juil. 2003 à 18:17
Sur ce site, surement, a toi de chercher :p
Sinon je peux te fournir de mes sources/faire un exemple y'a pas de probleme.
0
cs_Xentor609 Messages postés 258 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 16 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
0

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

Posez votre question
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
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).

#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")

int main(void)
{
SOCKET s;
SOCKET c;
sockaddr_in sin;
WSAEVENT EventClose = WSACreateEvent(); // on crée un EVENT

WSADATA wsa;
WSAStartup(MAKEWORD(2,0), &wsa);

s = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_family = AF_INET;
sin.sin_port = htons(2000);
sin.sin_addr.S_un.S_addr = INADDR_ANY;

bind(s,(sockaddr *) &sin, sizeof(sin));
listen(s, 5);

int SinSize = sizeof(sin);

c = accept(s, (sockaddr *) &sin, &SinSize);
WSAEventSelect(c, EventClose, FD_CLOSE); // on lie l'EVENT au socket c
printf("connection accepte\n");

WSAWaitForMultipleEvents(1, &EventClose, FALSE, WSA_INFINITE, FALSE); // on attend l'EVENT.
printf("connection perdue\n");
return 0;
}
0
cs_Xentor609 Messages postés 258 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 16 août 2004
28 juil. 2003 à 18:34
Ok, merci pour le code,
et voici mon mail pour m'envoyer ton petit client smtp stp:
phoenix_darkspirit@hotmail.com
Bye,Xentor609
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
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 :)

voila :)
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 juil. 2003 à 18:42
Envoyé.
Sinon je te conseille de lire les pages WSAAsyncSelect et WSASelectEvent sur msdn.
0
cs_Xentor609 Messages postés 258 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 16 août 2004
28 juil. 2003 à 18:46
Ok merci beaucoup!
Bye,Xentor609
0
cs_Xentor609 Messages postés 258 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 16 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
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 juil. 2003 à 18:49
Salut,
Merci Sebseb, je connais maintenant 3 méthodes :P
Cela dit ca marche qu'avec les threads.
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
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
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
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 :)
0
cs_Xentor609 Messages postés 258 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 16 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
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
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
0
cs_Xentor609 Messages postés 258 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 16 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
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
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.
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
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

hehe :)
0
cs_Xentor609 Messages postés 258 Date d'inscription jeudi 20 mars 2003 Statut Membre Dernière intervention 16 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
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
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

maintenant, libre a toi de penser le contraire :)
0
Rejoignez-nous