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

C# Discussion :

Pb exception non levée en cas de déconnexion serveur TCP


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut Pb exception non levée en cas de déconnexion serveur TCP
    Bonjour,
    J’ai développé un petit service d’échange de messages via une liaison TCP avec les classes TcpClient et TcpListener
    Et j’ai rencontré quelques soucis quand j’ai voulu tester le cas où la liaison est interrompue (j’arrête le serveur)

    Du coté serveur :

    public class ServeurMCT
    {
    private Form1 forme;
    private TcpListener serveur;
    private TcpClient client;
    private NetworkStream flux;

    //...

    public void Arreter()
    {
    client.Close();
    serveur.Stop();
    }
    }


    Du coté client :

    public class ClientTCP : TcpClient
    {

    public ClientTCP()
    : base()
    {
    }

    private NetworkStream fluxTCP;

    public byte[] EnvoyerMessage(byte[] message, ref string erreur)
    {
    byte[] temp = new byte[1024];
    byte[] reponse = null;
    string exMessage = "";

    try
    {
    // on envoie
    this.fluxTCP.Write(message, 0, message.Length);
    // --------------------------------------------------------------------------
    // puis on attend la réponse
    int nbOctets = this.fluxTCP.Read(temp, 0, temp.Length);
    reponse = new byte[nbOctets];
    for (int i = 0; i < nbOctets; i++)
    reponse[i] = temp[i];
    }
    catch (SocketException ex)
    {
    exMessage = ex.Message.ToString();
    }
    catch (IOException)
    {
    exMessage = "Non connecté au serveur";
    }
    catch (Exception ex)
    {
    exMessage = ex.Message.ToString();
    }
    finally
    {
    erreur = exMessage;
    }
    return reponse;
    }
    }


    Donc, si à un moment j’arrête mon serveur et que j’essaie à nouveau d’envoyer un message
    Il n’y a pas d’exception de levée pour signaler que la connexion a été interrompue…
    ça me renvoie un tableau reponse de dimension 0…
    Par contre, si j’exécute mon appli en pas à pas dans la méthode EnvoyerMessage, je passe bien dans le catch (IOException) …

    J’ai bien affecté des valeurs aux propriétés ReceiveTimeout et SendTimeout dérivées de TcpCLient…

    Quelqu’un pourrait-il me dire d’où ça vient ?...
    Merci

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    ça me renvoie un tableau reponse de dimension 0…
    En effet, nous avons constaté le même phénomène : la réception par un listener d'un message de longueur 0 est toujours synonyme de déconnexion.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Mais justement non
    il n'y a pas de déconnexion...
    c'est bien là le problème,
    ça ne me lève pas d'exception
    et si je fais un test sur la propriété Connected du TcpClient, elle est toujours à true...

    à moins que si je me mets en pas à pas,
    où là, les exceptions se lèvent et la propriété Connected passe bien à false...

    pb de temps, de délai de mise à jour?...
    faudrait que j'essaie de mettre un sleep peut être...

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Quand je disais "synonyme de déconnexion", ça ne signifait pas qu'on recevait un autre événement (comme une exception ou déconnexion) que la réception du message de longueur à 0.
    Je voulais juste dire qu'on traitait un msg de longueur 0 comme si on avait reçu une déco.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Par défaut
    Bon bah finalement,
    j'ai fait un test sur la longueur du message lu...
    pour que ça me renvoie un message d'erreur si elle est de 0:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
            public byte[] EnvoyerMessage(byte[] message, ref string erreur)
            {
                byte[] temp = new byte[1300];
                byte[] reponse = null;
                string exMessage = "";
     
                try
                {
                    // on envoie
                    this.fluxTCP.Write(message, 0, message.Length);
     
                    // puis on attend la réponse
                    int nbOctets = this.fluxTCP.Read(temp, 0, temp.Length);
     
                    if (nbOctets != 0)
                    {
                        reponse = new byte[nbOctets];
                        for (int i = 0; i < nbOctets; i++)
                            reponse[i] = temp[i];
                    }
                    else
                        exMessage = "Liaison TCP/IP interrompue";
                }
                catch (IOException)
                {
                    exMessage = "Liaison TCP/IP interrompue";
                }
                catch (Exception ex)
                {
                    exMessage = ex.Message.ToString();
                }
                finally
                {
                    erreur = exMessage;
                }
                return reponse;
            }
    comme ça, comme je fais un test sur la string erreur passée en référence,
    je sais s'il y a eu un pb...

Discussions similaires

  1. exception non levée malgré throw dans une boucle for
    Par marion5515 dans le forum Langage
    Réponses: 12
    Dernier message: 14/05/2009, 17h53
  2. [ADO] Exception Oracle non levée
    Par nguema dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/08/2008, 15h19
  3. Exception non levée
    Par michaelbob dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2006, 14h49
  4. Réponses: 4
    Dernier message: 14/02/2005, 19h41
  5. [thread] Exception non catchée
    Par mammistegon dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 22/11/2004, 21h43

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