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++

  1. #1
    Membre régulier
    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
    Points : 84
    Points
    84
    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 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 125
    Points : 33 029
    Points
    33 029
    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 régulier
    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
    Points : 84
    Points
    84
    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
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 4 551
    Points
    4 551
    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 régulier
    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
    Points : 84
    Points
    84
    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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    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)

  7. #7
    Membre régulier
    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
    Points : 84
    Points
    84
    Par défaut
    Ce sera certainement la solution par défaut oui.

    Cependant je souhaiterai différencier les simples plantages des déconnexions franches.
    D'où l'idée pour moi d'envoyer une requête au moment de la fermture du processus.

    Pour l'instant toutes les requêtes sont loguées donc l'inactivité est détectable sans message supplémentaire.
    Cette inactivité est cependant traduite en alerte et pas en déconnexion comme je le disais plus haut.

  8. #8
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Tu peux récupérer le signal SIGTERM et faire un traitement quand il survient.

    Par contre, tu ne pourras rien faire pour le SIGKILL…

  9. #9
    Membre régulier
    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
    Points : 84
    Points
    84
    Par défaut
    Bonjour White_tentacle,

    Cette possibilité m’intéresse, est-il possible de le faire avec du code C++ natif?

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par fanfouer Voir le message
    Bonjour White_tentacle,

    Cette possibilité m’intéresse, est-il possible de le faire avec du code C++ natif?
    Oui, via l'utilisation de la fonction signal() (ou sigaction(), pour être plus moderne ; si tu utilises des threads, la librairie pthread propose aussi des services similaires).
    [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.

  11. #11
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 853
    Points : 2 164
    Points
    2 164
    Par défaut
    Lorsqu'un client se déconnecte, si tu tentes de lire sur sa socket tu recevras une erreur (par contre si t'écris ça plantera, attention donc !). La solution des signaux n'est possible que sur environnement unix donc attention si tu vas sous windows.

    Tu peux récupérer le signal SIGTERM et faire un traitement quand il survient.

    Par contre, tu ne pourras rien faire pour le SIGKILL…
    Le signal SIGQUIT non plus, donc la seule solution pour éviter tout ça serait de lancer un service qui se chargerait de relancer ton programme à chaque fois qu'il se fermerait (fork, wait).

  12. #12
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    Cependant je souhaiterai différencier les simples plantages des déconnexions franches.
    D'où l'idée pour moi d'envoyer une requête au moment de la fermture du processus.
    Il n'y a pas plus simple que les SIGTERM, SIGKILL, etc...? Du style : Un message de déconnexion lors d'une déconnexion propre couplé à l'idée du "ping" périodique.

    Si le client ne fait plus "coucou" et qu'il n'a pas dit qu'il se déconnectait => Problème.

    Ça me semble moins sensible aux coupures réseaux ou matérielles non?

  13. #13
    Membre régulier
    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
    Points : 84
    Points
    84
    Par défaut
    Bonjour à tous,

    Citation Envoyé par Emmanuel Deloget Voir le message
    Oui, via l'utilisation de la fonction signal() (ou sigaction(), pour être plus moderne ; si tu utilises des threads, la librairie pthread propose aussi des services similaires).
    Citation Envoyé par imperio Voir le message
    La solution des signaux n'est possible que sur environnement unix donc attention si tu vas sous windows.

    Le signal SIGQUIT non plus, donc la seule solution pour éviter tout ça serait de lancer un service qui se chargerait de relancer ton programme à chaque fois qu'il se fermerait (fork, wait).
    Oui en effet si je cherche à produire du c++ natif c'est pour être portable sur des environnements unix comme des windows.
    Sur ce point, l'utilisation des signaux ne permettrait pas d'être compatible avec windows et ça me pose un soucis.

    Lorsqu'un client se déconnecte, si tu tentes de lire sur sa socket tu recevras une erreur (par contre si t'écris ça plantera, attention donc !).
    Il n'y a pas de sockets entre le client et le serveur.
    Je travaille en HTTP et la connexion est fermée à chaque échange.
    On évite ainsi d'écrire dans un socket fermé en effet.

    Citation Envoyé par bretus Voir le message
    Bonsoir,
    Il n'y a pas plus simple que les SIGTERM, SIGKILL, etc...? Du style : Un message de déconnexion lors d'une déconnexion propre couplé à l'idée du "ping" périodique.

    Si le client ne fait plus "coucou" et qu'il n'a pas dit qu'il se déconnectait => Problème.

    Ça me semble moins sensible aux coupures réseaux ou matérielles non?
    Je crois que je vais opter pour cela, ce sera moins contraignant.

    Cela va impliquer quelques remises en question mais au pris d'une certaine compatibilité.
    On peut considérer ce problème comme "résolu" même si aucune solution viable au problème initial n'est à envisager.

    Merci à tous.

+ 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