IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

exemple détection connection socket


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 18
    Par défaut exemple détection connection socket
    Bonjour,

    Je cherche à détecter si une socket est toujours connectée sur un pc distant. Dans FAQ VC++, la réponse est

    long one=1;
    /*CAsyncSocket*/ MySocket.SetSockOpt(SO_KEEPALIVE,(char *)&one,sizeof(one)))

    Comment ça marche?

    Que doit me renvoyr SetSockOpt si je coupe la connexion du pc distant?

    Est-ce-que quelqu'un possède un exmple de code?

    D'avance merci.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Quand on coupe la connexion sur le PC distant, ton CAsyncSocket reçoit la notification FD_CLOSE.
    Pour la traiter, tu dois redéfinir OnClose() dans ta classe fille de CAsyncSocket...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 18
    Par défaut
    J'utilise en fait la fonction
    int setsockopt(SOCKET s, int level, int optname, const char* optval,int optlen);
    car je ne dispose pas d'instance de la classe CAsyncSocket

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Le problème, c'est qu'il me semble bien que setsockopt(SO_KEEPALIVE) ne sert pas à consulter, mais à passer dans un mode ou la connexion est mieux surveillée (au lieu de ne détecter une fin que lors d'une tentative d'envoi ou de réception).

    Mais la fin est toujours signalée de la même manière, que l'option SO_KEEPALIVE soit activée ou non:
    • recv() retourne zéro
    • événement FD_CLOSE sur un socket asynchrone (CAsyncSocket, WSAEventSelect(), WSAAsyncSelect()...)
    • Activation de la fonction OnClose() d'un objet d'une classe dérivée de CAsyncSocket
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Mais comment faire pour detecter une connection perdue, :
    cette méthode permet de le detecter seulement si le socket a été fermé proprement avec closesocket(),
    mais lors d'un plantage par exemple cette fonction ne marche pas (elle dit que le socket est toujours connecté)

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    il existe un mecanisme le keep-alive qui permet coté serveur de verifier qu'une connexion socket est toujours valide.
    voir faq:
    http://c.developpez.com/faq/vc/?page...tectLossSocket

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Oui je sais j'ai deja regardé cette faq mais c'est pas vraiment ce que je cherche (ce truc permet de vérifier toute les x millisecondes) moi je cherche un truc qui renvoit tout de suite l'état du socket.

    Je sais pas si je me suis bien fait comprendre....

  8. #8
    Membre confirmé
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Par défaut
    le plus pratique à mon avis est encore de la faire à la main : si tu peux toucher la partie serveur, il te suffit de faire un très simple mecanisme d'echange de données entre client et serveur (un seul octet par ex), avec une limite de temps

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Par défaut
    Ok merci j'avais aussi pensé a ça, combien je peut mettre pour le delai max. ya t'il des conventions, des habitudes ?
    Le TCP/IP ne renvoit pas un message d'erreur si un paquet n'arrive pas à destination, on pourrait aussi utiliser ça non ?

    PS: je pense que je vais faire comme le propose OjBarbare car si c'est possible avec la 2ème solution ça doit être assez compliquer je pense...

Discussions similaires

  1. cherche exemple client udp socket
    Par - Glop - dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 08/06/2006, 10h52
  2. Problème de connection Socket Client
    Par xyz dans le forum Réseau
    Réponses: 27
    Dernier message: 12/04/2006, 15h13
  3. [POO] Exemple de Connection a une DB !!!
    Par wdionysos dans le forum Langage
    Réponses: 20
    Dernier message: 06/04/2006, 20h56
  4. [Debutant] Probleme connection socket
    Par sorry60 dans le forum Réseau
    Réponses: 38
    Dernier message: 12/11/2005, 11h46
  5. Envoyer un TPoint par une connection Socket ????
    Par jeldorak dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/11/2002, 19h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo