Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] Arret de TcpListener en attente de client

Sujet résolu
    2 mars 2015 à 0:06:34

    Bonjour,
        je suis actuellement en train de développer une application multi-utilisateur. Elle nécessite donc l'utilisation d'un serveur.
        Mon serveur possède un bouton pour être éteint:
        Lorsque j'appuie sur ce bouton, la fonction "stopListener()" est appelée:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    
    namespace CGestServer.Network
    {
        class CGestListener
        {
            public delegate void writeConsoleCallback(string text);
    
            Thread listenerThread;
    
            mainForm mF;
    
            TcpListener listener = null;
    
            public CGestListener(mainForm mF)
            {
                this.mF = mF;
    
                listenerThread = new Thread(new ThreadStart(init));
    
                listenerThread.Start();
            }
    
            public void stopListener()
            {
                listener.Server.Close();
    
                mF.textBox1.AppendText("\r\n [" + DateTime.Now.ToString("dd/MM/yyyy h:mm TT") + "] " + "Arret du serveur ...");
    
                listenerThread.Join();
    
                mF.textBox1.AppendText("\r\n [" + DateTime.Now.ToString("dd/MM/yyyy h:mm TT") + "] " + "Serveur arrêté");
            }
    
            public void writeConsole(string text)
            {
                if (mF.textBox1.InvokeRequired)
                {
                    writeConsoleCallback c = new writeConsoleCallback(writeConsole);
                    mF.Invoke(c, new object[] { text });
                }
                else
                {
                    mF.textBox1.AppendText("\r\n [" + DateTime.Now.ToString("dd/MM/yyyy h:mm TT") + "] " + text);
                }
            }
    
            public void createReader(CGestListener listener, TcpClient client)
            {
                CGestReader reader = new CGestReader(listener, client);
            }
    
            public void init()
            {
                try
                {
                    int port = 11347;
    
                    IPAddress ipAdrr = IPAddress.Parse("127.0.0.1");
    
                    listener = new TcpListener(ipAdrr, port);
    
                    listener.Start();
    
                    writeConsole("Le serveur a été démarré à l'adresse " + ipAdrr.ToString() + ".");
                    writeConsole("Le serveur est en écoute sur le port " + port.ToString());
    
                    while (mF.listenerWork)
                    {
                        TcpClient receivedClient = listener.AcceptTcpClient();
    
                        ThreadStart readerThreadStart = delegate() { createReader(this, receivedClient); };
    
                        Thread readerThread = new Thread(readerThreadStart);
    
                        readerThread.Start();
                    }
    
                    listener.Server.Close();
    
                    writeConsole("Arret du serveur ...");
    
                    
                }
                catch(Exception e)
                {
                    writeConsole("Erreur : " + e.Message);
    
                    listener.Server.Close();
    
                    writeConsole("Arret du serveur ...");
                }
                    
            }
    
        }
    }
        Seulement lorsque j'appelle cette fonction, une erreur est déclenchée:
    Une exception de première chance de type 'System.Net.Sockets.SocketException' s'est produite dans System.dll
    
    Informations supplémentaires*: Une opération de blocage a été interrompue par un appel à WSACancelBlockingCall
        Je ne sais pas comment supprimer cette erreur et comment arrêter mon serveur correctement. Je suis donc à la recherche d'un peu d'aide pour régler ce problème.
      Colarsis.
    • Partager sur Facebook
    • Partager sur Twitter
      2 mars 2015 à 0:56:43

      La ligne 77 est bloquante. Votre exception est du au fait que le socket est bloqué et que le débloquer via votre méthode fait lever une exception par le accepttcpclient();

      Si vous voulez arrêter votre serveur, ben faite le sortir de la boucle ligne 75 proprement? Pourquoi votre stopListener() ne passe pas mF.listenerWork à false (même si je ne sais pas c'est quoi!) ?

      Egalement,  avant de faire la ligne 77->83, fait un if (listener.Pending){...}. Mettez éventuellement un else system.threading.thread.sleep(200) pour ralentir la boucle si aucune connexion n'arrive!

      -
      Edité par breizhbugs 2 mars 2015 à 0:56:56

      • Partager sur Facebook
      • Partager sur Twitter
      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
        2 mars 2015 à 19:04:17

        Bonjour,

        J'ai essayé if(listener.Pending()) et ça marche correctement. Je te remercie de ton aide

        • Partager sur Facebook
        • Partager sur Twitter

        [C#] Arret de TcpListener en attente de client

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown