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

Développement Windows Discussion :

Named pipe qui ne veut pas rester ouvert


Sujet :

Développement Windows

  1. #1
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 191
    Points : 28 070
    Points
    28 070
    Par défaut Named pipe qui ne veut pas rester ouvert
    Salut à tous,

    Sur un projet, j'essaye de mettre en œuvre un canal nommé pour pouvoir dialoguer entre 2 processus (pour l'instant), d'un coté un service windows qui sera serveur, qui fonctionne sur le compte LocalSystem en démarrage automatique, de l'autre une IHM pour l'administrer (il pourra y avoir aussi peut-être par la suite un webservice, ou un bout d'intranet comme client).

    Lorsque j'essaye de communiquer je me prend une erreur "Impossible d'accéder à un canal fermé." tant coté serveur que coté client.

    Code serveur :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
                using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("MonTubeNomme"))
                {
                    while (true)
                    {
                        // Wait for a connection
                        pipeStream.WaitForConnection();
     
                        using (StreamReader sr = new StreamReader(pipeStream))
                        {
                            string cmd = sr.ReadLine();
                            switch (cmd)
                            {
                                case "#FLAG1":
                                    string lng = sr.ReadLine();
                                    while ((lng.ToUpper() != "#END") && (!sr.EndOfStream))
                                    {
                                        string key = lng.Split('§')[0];
                                        string value = lng.Split('§')[1];
     
                                        switch (key.ToUpper())
                                        {
                                            case "PRM1":
                                                _param1 = value;
                                                break;
                                            case "PRM2":
                                                _param2 = value;
                                                break;
                                            case "PRM3":
                                                _param3 = value;
                                                break;
                                        }
                                        lng = sr.ReadLine();
     
                                    }
                                    break;
                                case "#FLAG2":
                                    using (StreamWriter sw = new StreamWriter(pipeStream))
                                    {
                                        sw.AutoFlush = true;
                                        string tmp;
                                        tmp = "PRM1§" + _param1 + "\n";
                                        tmp += "PRM2§" + _param2 + "\n";
                                        tmp += "PRM3§" + _param3 + "\n";
                                        tmp += "#END";
     
                                        sw.WriteLine(tmp);
                                        pipeStream.WaitForPipeDrain();
                                    }
                                    break;
                            }
                        }
                    }
                }
    L'erreur,systématique, arrive sur pipeStream.WaitForConnection() au second passage

    Code du client :
    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
                    using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("MonTubeNomme"))
                    {
                        pipeStream.Connect(10000);
                        using (StreamWriter sw = new StreamWriter(pipeStream))
                        {
                            sw.AutoFlush = true;
                            string tmp;
                            tmp = "#FLAG2";
     
                            sw.WriteLine(tmp);
                            pipeStream.WaitForPipeDrain();
                        }
                        using (StreamReader sr = new StreamReader(pipeStream))
                        {
                            string tmp;
                            tmp = sr.ReadLine();
                            while ((tmp.ToUpper() != "#END") && !sr.EndOfStream)
                            {
                                string key = tmp.Split('§')[0];
                                string value = tmp.Split('§')[1];
     
                                switch (key.ToUpper())
                                {
                                    case "PRM1":
                                        txtPRM1.Text = value;
                                        break;
                                    case "PRM2":
                                        txtPRM2.Text = value;
                                        break;
                                    case "PRM3":
                                        txtPRM3.Text = value;
                                        break;
                                }
                                tmp = sr.ReadLine();
                            }
                        }
                    }
    L'erreur, pas systématique, se produit sur la 1ere ligne tmp = sr.ReadLine();
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    On a l'impression que ça commence à merder quand tu dispose le streamwriter coté client.

    Essaye de le garder ouvert et de le fermer et disposer à la fin, pour voir.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 191
    Points : 28 070
    Points
    28 070
    Par défaut
    C'est l'impression que j'ai aussi, au dispose d'un streamreader ou streamwriter, le canal est fermé. De ce que j'ai vu sur internet, c'est à peu toujours ce qui ressort de cette erreur (mais je n'ai pas vu de solution)

    J'ai essayer en incluant le streamreader du client dans le using du streamwriter, mais le phénomène est le même.

    J'ai essayer en replaçant les streamwriter, par les méthodes write du pipe, mais comme j'ai toujours les streamreaders, j'ai toujours le problème (et je trouve pas l'inspiration pour les remplacer)

    Ce qui me surprend, c'est que le canal peut être fermé, mais qu'il n'y a aucune méthode de prévu pour, d'une part tester qu'il est fermé, d'autre part le réouvrir
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par sevyc64 Voir le message

    Ce qui me surprend, c'est que le canal peut être fermé, mais qu'il n'y a aucune méthode de prévu pour, d'une part tester qu'il est fermé, d'autre part le réouvrir
    Pour tester si il est fermé, de mémoire, il me semble que tu as la propriété IsConnected

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 191
    Points : 28 070
    Points
    28 070
    Par défaut
    IsConnected indique apparemment s'il est connecté à un client.

    Par contre, si j'essaye de voir cet état lorsque le pipe est fermé, j'obtiens toujours ce satané message
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Perso je pencherai pour un autre effet de bord. Le "using" sur le NamedPipeClientStream, en général dans les classes du framework le "Dispose" fait un peu près la même chose qu'un "Close".

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 191
    Points : 28 070
    Points
    28 070
    Par défaut
    C'est pas impossible que j'ai ce problème aussi, mais actuellement le message arrive avant la fin de ce using.

    Je ne trouve aucun exemple de code ou tutoriels d'utilisation des named pipe en .Net (même en vb). Juste des truc très basiques se contentant généralement d'un oneshot pour montrer que ça marche, mais aucun ou le serveur reste/revient à l’écoute et peut répondre à plusieurs clients successifs.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    Bonjour,

    Le problème vient bien du Dispose() du StreamReader qui ferme le stream sous-jacent.

    Je vois deux solutions possible à ce problème :
    - utiliser les méthode Read() et Write() du NamePipeServerStream
    - créer une classe dérivée de StreamReader qui override la méthode Dipose(bool) afin d'éviter le Close() du Stream sous-jacent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    protected override void Dispose(bool disposing)
    {
        base.Dispose(false);
    }

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Ah bah non ton client, il est sortie du using

    De toute façon, microsoft recommande de faire du one-shot avec les named pipe (cf).

    Edit au vu du poste de Ketan,
    C'est pas bête du tout.

Discussions similaires

  1. [JScrollPane] qui ne veut pas se mettre en haut a gauche
    Par Cyber@l dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 24/11/2006, 11h41
  2. requetes qui ne veut pas passer
    Par suya95 dans le forum Requêtes
    Réponses: 14
    Dernier message: 04/07/2006, 15h17
  3. JOptionPane qui ne veut pas se fermer!
    Par benthebest dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 29/12/2005, 23h05
  4. un fichier qui ne veut pas être supprimé!!!!
    Par en_stage dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 22/10/2005, 02h08
  5. Ma fenêtre OpenGL ne veut pas rester ouverte
    Par Mynautor dans le forum OpenGL
    Réponses: 3
    Dernier message: 03/02/2005, 14h25

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