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 :

[tcplistener]fonction bloquante et multithread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Par défaut [tcplistener]fonction bloquante et multithread
    Bonjour,
    je suis débutant en c# et j'essaie de manipuler la classe tcplistener pour faire une classe, serveur monoclient voir code ci dessous:

    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
     
    namespace TEST_RemoteControl
    {
        class CSession
        {
            private static int iTimeEnd = 10000;
            private bool bRun;
            private Thread threadSession;
     
            static readonly int iListenPortDefault = 4000;
            int iListenPort = 4000;
            static int iSizeBufferRead = 256;
            private static TcpListener server;
     
            public void processClient()
            {
                byte[] data = new byte[iSizeBufferRead];                                
     
                while (Thread.CurrentThread.IsAlive && this.bRun)
                {
                    TcpClient client;
                    NetworkStream stream;
                    int iNbyteRead = 0;
                    int iNByteFree = data.Length; ;                
     
                    client = server.AcceptTcpClient();
                    if (client != null)
                    {
                        int iNbDataRead = 0;
     
                        stream = client.GetStream();
     
                        stream.ReadTimeout = iTimeEnd;
     
                        iNbDataRead = stream.Read(data,0,iNByteFree);
     
                        //si timeout se remettre en attente de connection
                        //sinon traiter les données reçu
                        //processData(iNbDataRead, data);
     
                        client.Close();
                    }
                }
     
                return;
            }
     
            public CSession(int iPort)
            {
                bRun = false;
                threadSession = new Thread(new ThreadStart(processClient));
                server = new TcpListener(System.Net.IPAddress.Any, iListenPort);
                iListenPort = iPort;
            }
     
            public CSession()
                : this(CSession.iListenPortDefault)
            {
            }
     
            public void Start()
            {            
                server.Start();
                bRun = true;
                threadSession.Start();
            }
     
            public void Stop()
            {
                bRun = false;
     
                if (!threadSession.Join(iTimeEnd))
                    threadSession.Abort();
            }
        }
     
     
        class Program
        {
            static void Main(string[] args)
            {
                CSession sessionObj = new CSession(4000);
     
                sessionObj.Start();
     
                Console.ReadLine();
     
                sessionObj.Stop();
     
                return;
            }
        }
    }
    Le code est loint d'etre parfait et je l'ai épuré de pas mal de chose.
    J'ai deux soucis:

    - 1 comment débloqué tcpaccept client dans le stop pour que ma thread server se termine correctement
    - 2 comment gérer le timeout sur le read pour se remettre en attente de connection.

    Merci de vos conseils.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    je n'y connais pas grand chose en client/server et socket mais en regardant la doc de TcpListener.AccepttcpClient ici tu peux lire :

    AcceptTcpClient is a blocking method that returns a TcpClient that you can use to send and receive data. Use the Pending method to determine if connection requests are available in the incoming connection queue if you want to avoid blocking.
    Donc je te conseille de regarder la méthode Pending .

    Pour ton second soucis tu peux peut-être simplement "avaler" l'exception, ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try
    {
       iNbDataRead = stream.Read(data,0,iNByteFree);
       processData(iNbDataRead, data);
    }
    catch(TimeOutException) //ici mettre le bon type d'exception, je ne sais pas si c'est bien celui là
    {
       //ne rien faire
    }

Discussions similaires

  1. [SOCKET] Sortir de la fonction bloquante "Receive"
    Par Cyrill26 dans le forum Développement
    Réponses: 1
    Dernier message: 02/08/2007, 09h32
  2. Fonction bloquante attendant un signal
    Par Jorodan dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 25/06/2007, 12h04
  3. Réponses: 3
    Dernier message: 10/01/2006, 14h01
  4. Réponses: 5
    Dernier message: 16/12/2005, 17h41
  5. [Threads] Sortir d'une fonction bloquante
    Par guejo dans le forum MFC
    Réponses: 19
    Dernier message: 17/08/2004, 14h12

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