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 :

Arret de TcpListener en attente de client


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2014
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Arret de TcpListener en attente de client
    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:

    Nom : 974710db45.png
Affichages : 279
Taille : 28,2 Ko

    Lorsque j'appuie sur ce bouton, la fonction "stopListener()" est appelée:
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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.

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    bonjour

    cette erreur est normal car, AcceptTcpClient block l'execution du thread où elle est appelé (c'est d'ailleurs pour celà que tu as un Thread qui permet d'écouter
    l'arrivée d'utilisateur et qui ne bloque pas ton programme pour faire autre chose).

    Un TcpListener.Stop() ferait également l'affaire.

    Mais dans les deux cas, il faut mettre un try/catch car, d'après la conception de la classe TcpListener (mais surtout des sockets qui sont derrières) une exception est levée
    quand on "arrête" brutalement le AcceptTcp...

    Juste un Try/catch et ça fera l'affaire !!!
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

Discussions similaires

  1. [XL-2010] Arret du code en attente des données de l'utilisateur
    Par zangaloni dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/03/2012, 11h36
  2. [Débutant] Problème socket serveur (attente du client)
    Par synolog dans le forum C#
    Réponses: 14
    Dernier message: 20/10/2011, 18h16
  3. Recette utilisateur: attentes du client
    Par Secator dans le forum Test
    Réponses: 1
    Dernier message: 06/04/2010, 17h15
  4. Chez un client, délai d'attente dépassé
    Par heddicmi dans le forum OVH
    Réponses: 4
    Dernier message: 02/11/2007, 12h20
  5. Réponses: 20
    Dernier message: 10/07/2006, 16h53

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