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

Langage C++ Discussion :

Execution lors de la fermeture d'un programme


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut Execution lors de la fermeture d'un programme
    Bonsoir,

    Je suis confronté au besoin de faire une déconnexion propre et obligatoire sur un service distant auquel se connecte un client c++ console que je développe actuellement.

    En fait mon client effectue une identification pour signaler son arrivée auprès du service distant et je souhaiterais signaler son départ au moment de sa fermeture.

    J'ai correctement défini le destructeur de la classe qui gère les échanges avec le serveur et ce dernier est bien exécuté lorsque le programme se déroule complétement et atteint un point où il se ferme tout seul.
    Néanmoins lorsque je ferme la console ou termine le processus, la mémoire est vidée beaucoup plus brutalement et les destructeurs ne sont pas exécutés.

    Le service distant nécessite une déconnexion propre pour autoriser une nouvelle connexion ultérieure, si il ne subsiste ne serait-ce qu'un seul cas où la déconnexion n'a pas lieu, je ne pourrai plus me reconnecter la fois suivante.


    Il m'étonne de ne rien trouver sur ce type de cas sur le forum ou sur Google plus généralement.
    Peut-être que certains auront connu des expériences similaires, merci par avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    sans vraiment répondre : que se passera-t-il si la connexion est tout simplement perdue ? (cable arraché ou que sais-je)
    Impossible de se reconnecter

    Il faudrait nous en dire plus sur ce que tu fais, parce que ça parait au mieux bancal.
    Est-ce le serveur qui interdit la reconnexion dans ce cas ? Ou le client ?

    Il faut en général prévoir un timeout à partir duquel on affirme que le client est mort (côté serveur et/ou le serveur côté client), sans être passé par la case déconnexion.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    Bonsoir Bousk,

    Citation Envoyé par Bousk Voir le message
    sans vraiment répondre : que se passera-t-il si la connexion est tout simplement perdue ? (cable arraché ou que sais-je)
    Impossible de se reconnecter
    Si la connexion est perdue ca n'est pas un soucis.
    Tant que le processus n'est pas mort il conserve en mémoire un jeton qu'il fourni à chaque accès entre son arrivée et son départ.

    Il faudrait nous en dire plus sur ce que tu fais, parce que ça parait au mieux bancal.
    Je déploie une solution distribuée qui communique avec une tête de réseau pour recevoir ses ordres (non c'est pas un botnet et quand bien même je ne prévois d’exécuter l'outil que sur mes machines).
    Pour se faire des clients apparaissent et disparaissent. Ils vont se connecter au service, ne serait-ce que pour signaler leur présence et recevoir leurs ordres.

    Chaque client est unique à tout instant sur le réseau, deux clients avec le même identifiant ne peuvent pas co-exister.
    Tous les clients sont par contre équivalents en termes de capacités, on peut les intervertir en modifiant leur configuration.
    Vu qu'on peut assez facilement la changer d'ailleurs, le premier arrivé sur le service est le premier servi et les demandes de connexion suivantes avec le même identifiant seront refusées par le serveur.
    Mais si un client reste identifié comme présent sur le serveur alors qu'il s'est barré, et bien il ne pourra logiquement pas se reconnecter.

    Il faut en général prévoir un timeout à partir duquel on affirme que le client est mort (côté serveur et/ou le serveur côté client), sans être passé par la case déconnexion.
    C'est déjà mesuré mais ça sort comme une alarme plutôt qu'une déconnexion automatique.
    Il est possible qu'un client plante ou qu'il y ai une coupure de courant dans sa zone. Du coup la tête de réseau doit le signaler comme une alarme plutôt que de faire une déconnexion automatique qui ne sera vue par personne.

    J'espère être clair et n'hésites pas à formuler des critiques sur ms hypothèses si tu le souhaites.

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par fanfouer Voir le message
    Bonsoir Bousk,


    Si la connexion est perdue ca n'est pas un soucis.
    Tant que le processus n'est pas mort il conserve en mémoire un jeton qu'il fourni à chaque accès entre son arrivée et son départ.


    Je déploie une solution distribuée qui communique avec une tête de réseau pour recevoir ses ordres (non c'est pas un botnet et quand bien même je ne prévois d’exécuter l'outil que sur mes machines).
    Pour se faire des clients apparaissent et disparaissent. Ils vont se connecter au service, ne serait-ce que pour signaler leur présence et recevoir leurs ordres.

    Chaque client est unique à tout instant sur le réseau, deux clients avec le même identifiant ne peuvent pas co-exister.
    Tous les clients sont par contre équivalents en termes de capacités, on peut les intervertir en modifiant leur configuration.
    Vu qu'on peut assez facilement la changer d'ailleurs, le premier arrivé sur le service est le premier servi et les demandes de connexion suivantes avec le même identifiant seront refusées par le serveur.
    Mais si un client reste identifié comme présent sur le serveur alors qu'il s'est barré, et bien il ne pourra logiquement pas se reconnecter.


    C'est déjà mesuré mais ça sort comme une alarme plutôt qu'une déconnexion automatique.
    Il est possible qu'un client plante ou qu'il y ai une coupure de courant dans sa zone. Du coup la tête de réseau doit le signaler comme une alarme plutôt que de faire une déconnexion automatique qui ne sera vue par personne.

    J'espère être clair et n'hésites pas à formuler des critiques sur ms hypothèses si tu le souhaites.
    Ping !

    Plus prosaïquement, le serveur envoie régulièrement un court message à son destinataire (en NODELAY), et celui-ci doit répondre de même. S'il ne le fait pas, alors il est considéré comme étant mort (c'est la technique utilisée par les serveurs IRC pour déterminer si un client est toujours actif).

    Je ne vois guère d'autre solution : tu n'auras jamais la possibilité d'intercepter la fermeture forcée du programme client (c'est impossible, pour des raisons de sécurité : si je peux intercepter un tel signal et exécuter du code en retour, alors je fork et hop, mon programme ne peut plus être tué).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    Bonjour Emmanuel,

    Citation Envoyé par Emmanuel Deloget Voir le message
    Ping !

    Plus prosaïquement, le serveur envoie régulièrement un court message à son destinataire (en NODELAY), et celui-ci doit répondre de même. S'il ne le fait pas, alors il est considéré comme étant mort (c'est la technique utilisée par les serveurs IRC pour déterminer si un client est toujours actif).
    Dans mon cas le serveur ne peut pas envoyer de message aux clients.
    Les communications sont systématiquement à l’initiative des clients puisque des éléments comme des NAT ne permettent pas de les atteindre directement.
    Le postulat est que les clients doivent être le plus souvent en activité donc contactent le serveur dès qu'ils le peuvent pour demander du travail.

    C'est ce qui pose certains problèmes ici je pense.

    Je ne vois guère d'autre solution : tu n'auras jamais la possibilité d'intercepter la fermeture forcée du programme client (c'est impossible, pour des raisons de sécurité : si je peux intercepter un tel signal et exécuter du code en retour, alors je fork et hop, mon programme ne peut plus être tué).
    En effet je comprends ce point de vue.

    Il faut que je trouve un moyen pour différencier une inactivité d'une déconnexion simple pour éviter les alarmes côté serveur mais cela semble être une quête sémantique et protocolaire assez étriquée

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Ajoute dans ton code un message périodique à destination du serveur. Si au bout d'un certain délais le serveur ne reçoit rien le serveur n'a qua considérer que le client est déconnecté.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme lors de la fermeture du programme
    Par Flow_75 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 05/09/2009, 19h59
  2. Problème lors de la fermeture du programme
    Par popo dans le forum Langage
    Réponses: 5
    Dernier message: 27/10/2008, 13h09
  3. Réponses: 3
    Dernier message: 01/02/2008, 13h42
  4. Réponses: 6
    Dernier message: 12/12/2007, 19h32
  5. Libérer les ressources lors de la fermeture d'un programme
    Par Heliopraetor dans le forum DirectX
    Réponses: 10
    Dernier message: 14/09/2004, 19h15

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