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

Réseau C Discussion :

Détecter la déconnexion d'un client (sockets C)


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 23
    Points : 23
    Points
    23
    Par défaut Détecter la déconnexion d'un client (sockets C)
    Bonjour tout le monde,
    je suis en train de développer une application client/serveur en C.
    J'utilise les socket unix.
    Je souhaite savoir s'il est possible de détecter qu'un client s'est déconnecté (ou que le lien réseau est rompu).

    Je sais qu'il est possible de tester le retour de la procédure 'send' lors d'une émission serveur -> client, mais je ne souhaite pas faire cela de cette manière pour les raisons suivantes:
    - Les données échangées entre le client et le serveur sont fixes de 16 octets, et je doit donc envoyer 16 octets pour ne pas faire bugguer le protocole de réception du client,
    - Le serveur doit traiter des flux de données massifs, et je souhaite donc éviter d'envoyer régulièrement 16 octets pour savoir si la connexion est toujours active (pour optimiser les performances).

    J'ai essayé d'utiliser 'send' avec des données nulles (0 octets) mais cela ne fonctionne pas toujours (par exemple, si j'ai 16 clients connectés, seul 2 ou 3 sont vus déconnectés).

    Existe t'il une procédure pour savoir si la connexion avec le client est toujours active ?

    Merci

  2. #2
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 382
    Points
    5 382
    Par défaut
    Euh ...
    Quelque part tu devrais être en permanance en écoute du client avec recv, c'est elle qui te dirait que le client est mort.

    tu trouveras un super cours ici qui utilise la fonction select.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 410
    Points : 23 809
    Points
    23 809
    Par défaut
    Bonjour,

    Citation Envoyé par dagos Voir le message
    Existe t'il une procédure pour savoir si la connexion avec le client est toujours active ? Merci
    — Soit la connexion est entièrement visible par le système et, dans ce cas, ton processus va automatiquement recevoir un signal SIGPIPE (sauf si tu as passé les flags idoines sur les systèmes d'exploitation qui les reconnaissent) et, dans ce cas, c'est à toi de rattraper ce signal et de gérer la fermeture. C'est ce qui va se passer si tu utilises un modem RTC dont la perte de porteuse est immédiatement détectable ;

    — Soit la connexion transite par un réseau sous-jacent et, dans ce cas, il n'y a pas moyen de savoir si une connexion est réellement interrompue si ledit réseau ne t'envoie pas un message de service explicite.

    Par exemple, c'est ce qui va se passer sur Internet, où il est officiellement prévu que des paquets puissent se perdre. L'administrateur de ton fournisseur d'accès peut marcher sur un câble réseau dans la salle machine et le débrancher. S'il était relié à un switch intelligent, celui-ci peut renvoyer un Host Unreachable ICMP qui peut remonter jusqu'à ton système. Si c'est un bête hub (ce qui est légal), les paquets vont se perdre dans le vide. Les différents protocoles sont généralement prévus pour réessayer à intervalles fixes. Il se peut également que le trafic soit mis temporairement en buffer. Dans tous les cas, la connexion reprend lorsque l'admin rebranche le câble et ton programme ne s'aperçoit alors de rien, si ce n'est d'un délai inhabituel.

    Bon. Ça c'est la théorie. En pratique, débrancher un câble dans une baie, ça provoque beaucoup de perturbations. Mais les préoccupations à prendre en compte dans ton programme restent vraies.

    Les clients et serveurs IRC, par exemple, implémentent un message « PING » (en rapport avec la commande éponyme) auquel l'homologue répond « PONG ». Si la réponse n'est pas parvenue dans un délai raisonnable, celui-ci est déclaré décédé. :-)

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    je ré-itère mon pointeur sur un code safe :

    http://www.developpez.net/forums/d10...t/#post5869608

  5. #5
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Euh perso je fait ça de manière plus simple, avec le select comme cité plus haut, tu sais quand tu as un évennement sur ton socket, ensuite lors de la lecture avec recv, si le retour est égal ou inférieur à 0, c'est que ta socket à un souci:
    _deconnexion du serveur
    _ problème reseu etc....

    Donc lors d'un retour egal ou inférieur à zéro je considère que la connexion est perdu, et deconnecte proprement la socket en dégageant tout ce qui la concerne

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 410
    Points : 23 809
    Points
    23 809
    Par défaut
    Citation Envoyé par skeud Voir le message
    Euh perso je fait ça de manière plus simple, avec le select comme cité plus haut, tu sais quand tu as un évennement sur ton socket, ensuite lors de la lecture avec recv, si le retour est égal ou inférieur à 0, c'est que ta socket à un souci:
    Le problème, comme dit plus haut également, c'est que cet événement peut ne pas parvenir jusqu'à ton système et donc jusqu'à ton socket.

  7. #7
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Le problème, comme dit plus haut également, c'est que cet événement peut ne pas parvenir jusqu'à ton système et donc jusqu'à ton socket.
    Ne pas parvenir? lors de la déconnexion du au reseaux, l'evennement parvient forcément non? sinon il reste la solution de mettre une lifetime sur les socket (on considère qu'au bout de 360 seconde d'inactivité sur une socket, on la déconnecte automatiquement)

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par skeud Voir le message
    Ne pas parvenir? lors de la déconnexion du au reseaux, l'evennement parvient forcément non? sinon il reste la solution de mettre une lifetime sur les socket (on considère qu'au bout de 360 seconde d'inactivité sur une socket, on la déconnecte automatiquement)
    non ça ne provient pas forcément...

    Entre les sockets gelés (frozen sockets), et les différences d'interprétation des CTRL-C CTRL-Z, ou kill, plus les coupures éventuelles dans un lien au milieu, on n'est pas toujours prévenu...

    D'autre part, considérer 360 secondes comme une limite est vraiment .... court... : j'avais des serveurs sur lesquels je pouvais n'avoir aucune donnée pendant 2 mois, puis 1 000 par seconde, puis 1 tous les 15 jours...


    Donc, penser général et safe est le seul truc safe..

  9. #9
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par souviron34 Voir le message

    Donc, penser général et safe est le seul truc safe..
    c'est à dire?

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par skeud Voir le message
    c'est à dire?
    je viens de l'expliciter :

    Entre les sockets gelés (frozen sockets), et les différences d'interprétation des CTRL-C CTRL-Z, ou kill, plus les coupures éventuelles dans un lien au milieu, on n'est pas toujours prévenu...

    D'autre part, considérer 360 secondes comme une limite est vraiment .... court...
    Donc prendre TOUTES précautions : signals, polls..

    C'est toi qui dit :

    Euh perso je fait ça de manière plus simple
    Sauf que ça n'embrasse pas TOUS les cas que l'on peut rencontrer...

  11. #11
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Ah ok je croyais que tu disais ça dans le sens rajouter des spécifications à ce que tu as dit .

    Dans quel cas on peut choper un SIGPIPE avec une socket?

  12. #12
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    C'est quoi comme application ?
    Ne peux-tu pas attendre d'avoir quelque chose d'utile à envoyer au client ?

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    @skeud :

    je ne sais plus exactement (j'ai codé et testé ça il y a presque 13 ans), mais si mes souvenirs sont bons un truc un peu comme lancer via une console, puis tuer la console, avoir un process "zombie" sous unixoides.. et le tuer..

    Mais c'est peut-être pas ça .. Trop lointain.

    Je me souviens en tous cas qu'on avait fait des tests assez exhaustifs (le client/serveur devait tourner 24h/24 7/7 365), entre des serveurs HP, des PCs linux, des PCs Win, en effectuant tout un tas de tests (par exemple purement et simplement éteindre ou débrancher le PC d'un coup), et que on tombait sur des cas étranges non détectés...

    D'où une pléthore de tests pour tout gérer...

  14. #14
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Ah oui effectivement, mes connaissance en serveur se limittant aux étude (max 15min pour un serveur lancer, et test a la con genre ctrl+C ....) je ne connais pas tout les cas d'erreur possible du au kevin qui tape dessus pour faire de la techtonique

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    ben oui, mais c'est bien pour ça qu"on dit "de manière sûre" ...

    Parce que il n'y a pas que "le kevin qui tape dessus pour faire de la techtonique" ...

    La foudre qui tombe et un disjoncteur qui arrête toute une salle des machines, un backup qui se passe mal et bloque un système, un disque plein, etc etc etc...

    La réalité dépasse très souvent la fiction, et les scénarios de "hangup" sont rarement "clean"...

    Encore une fois, la différence entre la théorie et la pratique...


  16. #16
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    théoriquement ça marche



  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 23
    Points : 23
    Points
    23
    Par défaut
    merci pour vos réponses.
    Pour SIGPIPE, le signal n'est généré que si j’appelle la procédure 'send' (cela dit j'ai pas essayé avec des données nulles).

    J'utilise 'recv' en mode non bloquant donc ça ne m'aide pas beaucoup ('recv' retourne 0 même si le socket client est fermé).

    Il faut donc que je me penche sur 'select' et 'poll' si j'ai bien compris...

Discussions similaires

  1. [socket] détecter une déconnexion
    Par ArgusAzure dans le forum Réseau
    Réponses: 4
    Dernier message: 22/03/2007, 12h30
  2. [Socket] Détecter une déconnexion
    Par leyee dans le forum Développement
    Réponses: 2
    Dernier message: 05/12/2005, 13h27
  3. [Socket] Détecter la déconnexion d'un client
    Par leyee dans le forum Entrée/Sortie
    Réponses: 21
    Dernier message: 24/11/2005, 11h33
  4. [Configuration] Détecter des paramètres du navigateur client...
    Par Olish dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 08/10/2005, 19h09
  5. Réponses: 9
    Dernier message: 17/08/2004, 17h16

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