Partage
  • Partager sur Facebook
  • Partager sur Twitter

C# et netwotkstream

    30 décembre 2019 à 18:03:07

    Bonjour, 

    pour  un projet pour les cours je dois simuler un tcplistener et ses clients. (En synchrone malheureusement) 

    Jusque la pas trop de soucis. Seulement j’ai un soucis. J’ai un thread du style « keep alive » et un autre  « éphémère » qui va me servir à lire la réponse de ce que m’envoie mon client.

    Mais je me heurte a un soucis. Mon premier thread a un premier while avec une variable de type bool ce tte variable je la change dès que je veux lire la réponse de mon client pour arrêter cette premiere boucle et dans cette  boucle il y a le second  while celui de la lecture du stream. Le but  etant d’arrêter le thread du keep alive, pour relancer un nouveau keepalive

    Je n’arrive pas à arrêter à temps ce premier thread du coup je me retrouve avec les données reçu pas là où il faut. Par conséquent je n'ai pas le bon traitement de données...

    J’ai lu sur internet énormément de chose notamment qu’il faut éviter de récupérer le flux à plusieurs endroits. Mais comment faire dans ce cas pour tout gérer proprement sans avoir un bloc d’instructions à rallonge ? 

    Et comment puis je corriger correctement ce bug ? 

    Premier thread :

      try
                    {
                        NetworkStream stream = socPim.GetStream();  
               
         Byte[] bytes = new Byte[16];
    
    while (!loopKA)
                        {
     
    
                     
                             while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                            {
                            if (loopKA 
                                {
                                    
                                    return;
                                }
                            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                            Console.WriteLine("[KA] - - KeepAlive reçu : <" + data + ">  Attendu : <" + KeepAlive + ">");
    
                            if (data.Trim() ==  KeepAlive)
                            {
                         
                               
                                
                                    byte[] send = System.Text.Encoding.ASCII.GetBytes(response);
                                    stream.Write(send, 0, send.Length);
                                }



    second thread :

     try
                {
                    int i;
    
    
                    NetworkStream stream = client.GetStream();
                    List<int> inMsg = new List<int>();
                    bool startTrame = false;
                    receipt = 0;
                    Byte[] bytes = new Byte[1];
                    string data = null;
    
                    while ((i = stream.Read(bytes, 0, 1)) != 0)
                    {
                        if (bytes[0] == MessageDialogue.FRAME_END)
                        {
                            break;
                        }
                        else if (bytes[0] == MessageDialogue.FRAME_HEAD)
                        {
                            startTrame = true;
                            inMsg.Clear();
    
                            Console.WriteLine("STX");
                        }

    Quelque part dans le code

    loopKA = true;    
    while ((outMsg = getStack().pop()) != null)
                        {
    
    
     
                            Console.WriteLine("[send] " + txt+ "Envoi du message " + nbM + " / " + sizeStack + " - [essai " + loop + " ]");
     
    
                          
    
                            MessageSend.sendMsg(outMsg, soc);
                            Thread t = new Thread(new ThreadStart(threadSendMsg));
                            t.Start();
    
                            Console.WriteLine(txt + "reception des données : ");
    
    
                            try
                            {
                                t.Join(TIME_OUT);
    
                              if (receipt != 1)
                                {
                                    if (loop < 3)
                                    {
                                        loop++;
                                        nbM--;
                                        getStack().push(outMsg);// Remise du msg dans la pile pour nouvel essai
     
                                        Console.WriteLine("[send] " + txt+ "xxxxxxxxx PAS DE REPONSE xxx nouvel essai xxxx.");
     
                                    }





    Voila j'espère que j'ai été assez claire... 

    En gros comment gérer plusieurs réponses de mon client de manière distincte ou non et proprement ?

    merci

    -
    Edité par nitr037 30 décembre 2019 à 18:26:19

    • Partager sur Facebook
    • Partager sur Twitter
      31 décembre 2019 à 23:26:47

      Vous utilisez clairement les mauvaises API (appels synchrones comme Read sur un flux TCP etc...).

      Il y a énormément de manière de faire (un thread avec des async/await, des expressions lambda, etc...), ais je ne comprends pas la logique qui veut que vous ne devez pas utiliser correctement des classes "correctement".

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

      C# et netwotkstream

      × 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