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 :

TCP - Impossible de voir la déconnexion d'un serveur


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Par défaut TCP - Impossible de voir la déconnexion d'un serveur
    Bonjour à tous,

    Problème surement basique mais dont je n'arrive pas à trouver la solution.

    J'utilise un client TCP en C++ pour me connecter à un serveur TCP sur un VAX.

    Côté C++, j'instancie ma socket est effectue un connect.

    J'envoie ensuite des messages via la méthode send.

    Si entre deux send, le serveur se déconnecte et se reconnecte, je ne détecte pas cette déconnexion et ma fonction send peut être ensuite appelé sans qu'aucun code erreur ne soit retourner.

    Je sais qu'en VB par exemple, il existe un événement permettant de détecter la déconnexion d'un serveur TCP mais quid pour el C++ ?

    Merci d'avance

    [EDIT : à noter que mon serveur ne doit jamais me renvoyer de données]

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    C'est quoi pour toi le serveur se "déconnecte et se reconnecte"

    Si le socket est fermé au niveau du serveur entre les 2 send, le 2eme send devrait retourner une erreur.

    Maintenant, si le serveur quitte le réseau (switch arrêté et relancé par exemple ou câble réseau enlevé), il est possible que tu ne le voies pas effectivement
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    C'est quoi pour toi le serveur se "déconnecte et se reconnecte"

    Si le socket est fermé au niveau du serveur entre les 2 send, le 2eme send devrait retourner une erreur.

    Maintenant, si le serveur quitte le réseau (switch arrêté et relancé par exemple ou câble réseau enlevé), il est possible que tu ne le voies pas effectivement
    Le programme serveur coupe la liaison, ferme la socket et en crée nouvelle pour se mettre en attente de connexion.

    Donc j'envoie un premier send ==> OK

    Mon programme serveur se "deconnecte" (voir explication ci-dessus)

    j'envoie un deuxième send ==> OK (mais le serveur ne reçoit rien).

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    Ton client fonctionne sur quelle plateforme ? Sur un unixoïde, en principe, la fermeture du socket devrait provoquer un SIGPIPE du côté de l'écrivain.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Ton client fonctionne sur quelle plateforme ? Sur un unixoïde, en principe, la fermeture du socket devrait provoquer un SIGPIPE du côté de l'écrivain.
    Oui c'est une Suse.
    Je reçois bien le SIGPIPE, mais uniquement si je tente d'envoyer un message alors que le serveur est HS (et encore le premier send ne me retourne pas d'erreur, je dois attendre le deuxième)

    Le cas que j'ai ici est le suivant.

    Mon client se connecte au serveur.
    Envoie de données au serveur.
    Le serveur pour une raison lambda, ferme la socket et la recréé juste après.
    Si mon client n'envoie pas de données durant la période où mon serveur à fermer sa socket et rouvert de nouveau, mon client ne voit pas que le serveur s'est déconnecté (normalement me direz-vous puisque si il ne fait pas de send il ne sait pas si le serveur est encore en face)
    PAR CONTRE, si je tente d'envoyer un message après un laps de temps de quelques minutes après que mon serveur a rouvert une socket. Mon client ne se plante pas (pas de SIGPIPE ou autres) et se comporte comme si les messages arrivaient bien alors que mon serveur ne reçoit rien bien sûr car il est en attente de connexion.

  6. #6
    Expert confirmé

    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
    Billets dans le blog
    2
    Par défaut
    un poll avant envoi/réception plus régulièrement (par exemple une fois toutes les 10 ou 20 ou 30 secondes) devrait te permettre de détecter...

    Plus inclusion de SIGHUP, SIGQUIT, SIGTERM...

    le poll sur SIGIO

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 776
    Par défaut
    Citation Envoyé par Sphost Voir le message
    ...
    PAR CONTRE, si je tente d'envoyer un message après un laps de temps de quelques minutes après que mon serveur a rouvert une socket. Mon client ne se plante pas (pas de SIGPIPE ou autres) et se comporte comme si les messages arrivaient bien alors que mon serveur ne reçoit rien bien sûr car il est en attente de connexion.
    Comment c'est supposé marcher cette affaire?

    A priori, les données du deuxième send sont expédiées au serveur qui devrait les ignorer.
    Côte IP client, on attend l'acquittement... et comme il ne vient pas on ré-essaie un certain nombre de fois...
    Au bout d'un certain temps, le client devrait sortir en timeout.

    Je vous suggère d'utiliser Ethereal ou équivalent pour tester la théorie.
    (attendez vous assez? Est ce que le VAX vous retourne des acquittements? J'en serais étonné mais... faut regarder pour voir ;-)

    Pour savoir un peu plus vite ce qui se passe de l'autre côté du lien, regardez du côté de l'option "SO_KEEPALIVE".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert confirmé

    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
    Billets dans le blog
    2
    Par défaut
    Non je ne crois pas que ce soit le Vax...

    Je pense plutôt que c'est le code du PO :

    Citation Envoyé par Sphost Voir le message
    Oui c'est une Suse.
    Je reçois bien le SIGPIPE, mais uniquement si je tente d'envoyer un message alors que le serveur est HS (et encore le premier send ne me retourne pas d'erreur, je dois attendre le deuxième)

    Le cas que j'ai ici est le suivant.

    Mon client se connecte au serveur.
    Envoie de données au serveur.
    Le serveur pour une raison lambda, ferme la socket et la recréé juste après.
    Si mon client n'envoie pas de données durant la période où mon serveur à fermer sa socket et rouvert de nouveau, mon client ne voit pas que le serveur s'est déconnecté (normalement me direz-vous puisque si il ne fait pas de send il ne sait pas si le serveur est encore en face)
    PAR CONTRE, si je tente d'envoyer un message après un laps de temps de quelques minutes après que mon serveur a rouvert une socket. Mon client ne se plante pas (pas de SIGPIPE ou autres) et se comporte comme si les messages arrivaient bien alors que mon serveur ne reçoit rien bien sûr car il est en attente de connexion.
    Ton serveur fait-il vraiment un close suivi d'un shutdown quand il se ferme (avant de redméarrer sur un socket suivant) ?

    Ton client ne semble pas être protégé contre tous les événements pouvant arriver sur un socket... (en particulier faire un poll avant un send/write ou read/recv).

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/10/2007, 20h27
  2. Impossible de voir l'utilisateur via Entreprise Manager
    Par zut94 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/09/2007, 14h35
  3. Réponses: 21
    Dernier message: 04/07/2007, 23h06
  4. [Visual Web] impossible de voir le mode design
    Par diamonds dans le forum NetBeans
    Réponses: 3
    Dernier message: 22/02/2007, 07h12
  5. Impossible de voir mon HD externe en firewire
    Par arfy dans le forum Windows XP
    Réponses: 6
    Dernier message: 23/11/2006, 19h40

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