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 :

Rupture liaison sur socket non-bloquant


Sujet :

Réseau C

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut Rupture liaison sur socket non-bloquant
    Bonjour,

    J'ai une application qui utilise un socket (winsock2) TCP/IP non-bloquant dont la lecture est cadencé toute les 1 MS.
    La fonction recv() me retourne -1 lorsqu'il n'y a pas de données, avec un WSAGetLastError() retournant WSAEWOULDBLOCK.
    Lorsque le serveur sur lequel je me connecte clos la session, recv() me retourne 0.
    Lorsqu'une rupture liaison a lieu sans qu'un des 2 acteurs de la COM n'en soit à l'initiative, recv() me retourne toujours -1 et WSAGetLastError() me retourne toujours WSAEWOULDBLOCK...

    Ma question est la suivante: comment est-il possible de detecter un broken link sur un socket non-bloquant ? ai-je fait quelque chose à l'envers ?

    Merci.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je pense que la rupture n'a pas encore été détectée quand tu as WSAEWOULDBLOCK.
    Déjà, assure-toi qu'elle soit détectable (SO_KEEPALIVE a un rapport avec ça, il me semble).

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Les fermetures de sockets, c'est toujours un peu ch...
    Bon, déjà, tu peux faire un petit tour vers ces infos.
    Pour répondre,
    1/ Dans le premier cas, normalement ta socket devrait passer dans un temps plus ou moins long recevoir un WSAECONNRESET.
    2/ Dans le second cas (typiquement, tu as débranché le cable), il faut laisser le temps au protocole de se rendre compte que l'autre extrémité n'est plus joignable. De mémoire (donc je peux me tromper), sous Windows, ça doit prendre 1'30 me semble-t-il. Ce sont des paramètres en base de registre.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Merci pour vos réponses.
    Le premier cas ne me pose pas de problème en soit, c'etait juste pour situer le comportement que j'aimerais reproduire avec une rupture liaison physique.

    Effectivement j'ai déjà regardé du coté de KeepAlive mais je n'ai pas observé de changement.
    J'ai tout de même un polling applicatif qui, en cas d'échec de transmission, bascule la session en offline mais ce polling à une étendue de valeurs plutôt large et d'ailleurs il n'est pas fait pour vérifier l'etat de la liaison (mais l'état 'protocolaire' du RTU avec lequel je discute).

    Je vais regarder comment paramètrer la période de keepalive pour voir.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2004
    Messages : 77
    Points : 97
    Points
    97
    Par défaut
    Pour info:

    L'implémentation du keepalive est facultative et sa présence n'est donc pas garantie, ni sur mon système, ni sur mon RTU - RFC 1122, section 4.2.3.6
    Implementors MAY include "keep-alives" in their TCP
    implementations, although this practice is not universally
    accepted. If keep-alives are included, the application MUST
    be able to turn them on or off for each TCP connection, and
    they MUST default to off.
    D'autre part, le keepAlive ne remplirait pas la fonction voulu (qui est de savoir si réellement mon équipement distant est physiquement en vie sur le socket) mais plutôt de maintenir le lien en vie au moins de son coté (pour par exemple éviter les déconnexions sur inactivité...).

    Bref je n'ai pas d'autre alternative que d'utiliser le polling du protocole applicatif, ce qui reste tout de même assez logique (d'où son implémentation régulière dans les protocoles maitres-maitres; ce qui corrige ainsi l'erreur de mon post précédent).
    Un broken-link n'est véritablement détectable sur une machine uniquement lorsqu'il a lieu directement entre la machine et le premier équipement réseau auquel elle est connecté (et qui -je pense- est détecté due à l'absence de signal électrique sur la carte).

    Pour résumé, fermeture de socket distant et broken-link proche: détectable.
    Rupture liaison n'importe où sur le réseau: un système de polling doit être mis en place.

    merci tout de même pour votre aide.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par oLie93 Voir le message
    merci tout de même pour votre aide.
    Merci pour toutes ces précisions

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

Discussions similaires

  1. [timer & thread] timeout & socket non bloquant
    Par untipy dans le forum Réseau
    Réponses: 33
    Dernier message: 22/08/2007, 08h37
  2. socket non bloquant
    Par Mister_Don dans le forum C++
    Réponses: 18
    Dernier message: 17/08/2007, 17h57
  3. [Réseau] socket non bloquant
    Par beLz dans le forum Réseau
    Réponses: 2
    Dernier message: 28/07/2007, 15h20
  4. Réponses: 3
    Dernier message: 20/10/2006, 19h50
  5. socket non bloquante
    Par jeje99 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/02/2006, 08h52

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