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 :

Quitter un Thread TCPListener


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut Quitter un Thread TCPListener
    Bonjours,

    dans mon programme je lance un Thread qui va faire l'écoute d'un port TCP et va attendre un connexion. (Il répète les connexions en boucle)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IPAddress localAddr = IPAddress.Parse(m_ipEcoute);
    m_serveur = new TcpListener(localAddr, m_port);
    m_serveur.Start();
     
    m_client = m_serveur.AcceptTcpClient();
    try
    {
        m_stream = m_client.GetStream();
    }
    catch
    { }
    Comment on fait pour arrêter proprement l'écoute de ce serveur (qui se trouve sur un autre thread)?

    - Stop() sur l'objet de fonctionne pas
    - Tuer le processus ne fonctionne pas non plus
    Peu importe ce que je fais, le thread reste toujours ouvert même quand je ferme le programme. (Ça empêche même la fermeture de Windows)

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Y'a un bout de code ici tiré de la MSDN. Le listner.stop() est dans le finally. Peut-être la différence qui fera que ça marche. Il me semble qu'il faut aussi fermer le client.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut
    Merci Immobilis

    En fais mon problème n'est pas là. J'ai 2 programmes complets qui fonctionnent bien. Je peut faire plusieurs connexions sans troubles.

    Le problème est justement qu'une fois que la connexion est finie, la boucle recommence et le Thread attend pour un nouveau client. Je dois alors fermer le serveur à partir d'un autre Thread (et Stop() ne fonctionne pas). Parce que même en quittant, le programme reste en mémoire à attendre des connexions. Pire que ça, le système ne se ferme pas (il y a un bug) lorsque le Thread est ouvert. On doit ouvrir le gestionnaire de tâche pour tuer le processus.

    Je vais essayer une solution avec un serveur asynchrone. Je vais utiliser la fonction EndAcceptTcpClient. J'ai déjà régler des problèmes de Thread en changeant la méthode pour une méthode asynchrone. Alors on vera bien.

    Je vous redonne des nouvelles
    Merci d'avance si vous avez d'autres suggestions

  4. #4
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut
    Ça ne fonctionne pas plus en mode Asynchrone (ou je ne sais pas comment faire). La fonction EndAcceptTcpClient demande un résultat reçu du BeginAcceptTcpClient.

    Je suis à court de ressource. Si quelqu'un à des idées ou un lien qui pourrais m'aider.
    Merci.

  5. #5
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Si c'est pas trop long, peux-tu montrer la totalité du code qui met ton serveur en écoute?
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #6
    Membre confirmé Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Par défaut
    C'est en effet assez long comme code, mais voici ce que ça donne :

    Quelques fonctions de la classe 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
    public class ClReseauTCPListener
    {
        private string m_ipEcoute;
        private int m_port;
        private TcpListener m_serveur;
        private TcpClient m_client;
        private NetworkStream m_stream;
        Object myLockRead;
        Object myLockWrite;
     
        public ClReseauTCPListener(string p_ipEcoute, int p_port)
        {
            m_ipEcoute = p_ipEcoute;
            m_port = p_port;
            myLockRead = new Object();
            myLockWrite = new Object();
        }
     
        ~ClReseauTCPListener()
        {
            try
            {
                Terminer();
            }
            catch
            { }
        }
     
        public void Initialiser()
        {
            IPAddress localAddr = IPAddress.Parse(m_ipEcoute);
            m_serveur = new TcpListener(localAddr, m_port);
            m_serveur.Start();
     
            m_client = m_serveur.AcceptTcpClient();
            try
            {
                m_stream = m_client.GetStream();
            }
            catch
            { }
        }
     
        public void Terminer()
        {
            m_client.Close();
            m_serveur.Stop();
        }
     
        // Autres fonctions pour envoyer et recevoir (...)
    }
    Quelques fonctions de la classe de TRANSFERT :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    private ClDocument m_doc;
    private ClReseauTCPListenerAsync m_tcpListener;
    private bool m_quitterThread;
    private Thread m_threadReseau;
     
    private void InitialiserServeur()
    {
    	// (...)
        m_tcpListener = new ClReseauTCPListener(ClReseauMachine.AdresseIPPrincipale(), m_doc.Configurations.NoPort);
    }
     
    public void AttendreConnexion()
    {
        // Pour chaque connexion complète avec un client
        for(;;)
        {
            m_quitterThread = false;
            InitialiserServeur();
     
            m_tcpListener.Initialiser();
     
            try
            {
            	// Authentification avec mots de passe
                // À ce point-ci, la connexion est lancée.
                if (!AuthentifierClient())
                {
                    // Échec d'authentification (...)
                }
                else
                {
                    // Envoie des données (...)
                }
            }
            catch
            { 
                // Afficher message d'erreur (...)
            }
            finally
            {
                m_tcpListener.Terminer();
            }
     
            if (m_quitterThread)
                break;
        }
    }
     
    public void FermerServeur()
    {
        try
        {
            m_quitterThread = true;
            m_tcpListener.Terminer();
        }
        catch
        { }
    }
     
    public void ConnexionServeur()
    {
        Thread thread = new Thread(new ThreadStart(AttendreConnexion));
        m_threadReseau = thread;
        thread.Start();
    }
    Dans mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_doc.TraficReseau.ConnexionServeur()
    Donc ce qui ne fonctionne pas c'est de soit
    - Appeler la fonction FermerServeur()
    - Tuer le processus
    - Utiliser la même méthode mais avec les fonctions asynchrones et d'essayer FermerServeur() ou tuer le processus

    Merci d'avance pour vos réponses

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

Discussions similaires

  1. Quitter une fonction qui fait une boucle dans le Thread ?
    Par bboy0303 dans le forum Multithreading
    Réponses: 2
    Dernier message: 25/05/2009, 17h58
  2. TCPListener + Mutli-threads
    Par mimosa803 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/03/2009, 12h44
  3. Réponses: 4
    Dernier message: 04/07/2008, 05h50
  4. Quitter un Thread c++
    Par libery dans le forum Threads & Processus
    Réponses: 13
    Dernier message: 14/11/2007, 21h50
  5. [thread] quitter le programme
    Par joneil dans le forum C
    Réponses: 3
    Dernier message: 24/10/2005, 13h52

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