Partage
  • Partager sur Facebook
  • Partager sur Twitter

Retry Logic

    18 février 2021 à 14:39:16

    Bonjour , je communique avec un équipement UDP j'envoie et je reçois réponse avec ce code

        public byte[] Rx_message = new byte[12];
        public byte[] packedMessage2 = new byte[12];
        public IPEndPoint sendEndPoint;
    
        public void senderUdpClient(byte Type, byte CommandC, byte CodeCmd, Int32 X, Int32 Y)
        {
            string serverIP = "192.168.2.11";
            int sendPort = 40960;
            int receivePort = 40961;
            var span = new Span<byte>(packedMessage2);
            span[0] = Type;
            span[1] = CommandC;
            span[2] = CodeCmd;
            BinaryPrimitives.WriteInt32LittleEndian(span.Slice(3, 4), X);
            BinaryPrimitives.WriteInt32LittleEndian(span.Slice(7, 4), Y);
            var sum = unchecked((byte)packedMessage2.Take(11).Sum(x => x));
            span[11] = sum;
            sendEndPoint = new IPEndPoint(IPAddress.Parse(serverIP), sendPort);
            try
            {
                    UdpClient senderClient = new UdpClient();
                    senderClient.Connect(this.sendEndPoint);
                    senderClient.Send(packedMessage2, packedMessage2.Length);
                    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                    UdpClient receivingUdpClient = new UdpClient(receivePort);
                    receivingUdpClient.Client.ReceiveTimeout = 50;
                    // receive message
                    Rx_message = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                    senderClient.Close();
                    receivingUdpClient.Close();
                
            }
            catch (Exception ex)
            {
     
            }
        }
    


    Je veux ajouter un mécanisme de retry pour réssayer de se connecter en cas de problème de connexion (Rx_messages[0] = 0)

    ou  en cas de réception d'un message erroné (Rx_messages[0] = 1) si j'arrive toujours pas à se connecter je dois faire un nouveau essaye si le problème persiste je dois afficher un message d'erreur

    public byte[] Rx_message = new byte[12];
            public byte[] packedMessage2 = new byte[12];
            public IPEndPoint sendEndPoint;
            public int Connected = 0;
            public void senderUdpClient(byte Type, byte CommandC, byte CodeCmd, Int32 X, Int32 Y)
            {
                string serverIP = "192.168.2.11";
                int sendPort = 40960;
                int receivePort = 40961;
                var span = new Span<byte>(packedMessage2);
                span[0] = Type;
                span[1] = CommandC;
                span[2] = CodeCmd;
                BinaryPrimitives.WriteInt32LittleEndian(span.Slice(3, 4), X);
                BinaryPrimitives.WriteInt32LittleEndian(span.Slice(7, 4), Y);
                var sum = unchecked((byte)packedMessage2.Take(11).Sum(x => x));
                span[11] = sum;
                sendEndPoint = new IPEndPoint(IPAddress.Parse(serverIP), sendPort);
                
                    for(int i = 0; i< 2; i++)
                    {
                    try
                    {
                        UdpClient senderClient = new UdpClient();
                        senderClient.Connect(this.sendEndPoint);
                        senderClient.Send(packedMessage2, packedMessage2.Length);
                        IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                        UdpClient receivingUdpClient = new UdpClient(receivePort);
                        receivingUdpClient.Client.ReceiveTimeout = 50;
                        // receive message
                        Rx_message = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                        //first case where it is connected and I receive my answer correctly
                        if (Rx_message[0] == 2)
                        {
                            Connected = 1;
                            break;
                        }
                        //if I can't connect
                        if (Connected == 0)
                        {
                            //first try
                            if (i < 1)
                            {
                                Thread.Sleep(20);
                                continue;
                            }
                            //second try
                            if (i == 1)
                            {
                                //these two lines I put it just so that the code goes to try and shows me the error code
                                receivingUdpClient.Client.ReceiveTimeout = 1500;
                                Rx_message = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                            }
                        }
                        senderClient.Close();
                        receivingUdpClient.Close();
                    }
                    catch (Exception ex)
                    {
                        if (Connected == 0)
                        {
                            MessageBox.Show("Error Connection");
                        }
                        sbyte type_message = Convert.ToSByte(Rx_message[0]);
    
                        if (type_message == -1)
                        {
                            if (Rx_message[3] == 1)
                            {
                                MessageBox.Show("Type invalide");
                            }
                            if (Rx_message[3] == 2)
                            {
                                MessageBox.Show("Commande invalide");
                            }
                            if (Rx_message[3] == 3)
                            {
                                MessageBox.Show("Argument invalide!");
                            }
                            if (Rx_message[3] == 4)
                            {
                                MessageBox.Show("Erreur CS!");
                            }
                        }
                    }
                }
            }

    J'ai essayé de faire un code mais ça marché pas comme je veux, puisque au premier essaye s'il arrive pas à se connecter il passe directement au block catch sans continuer le code, y a t'il moyen de le focer à continuer ? ou sinon vous aurais d'autre idée pour le faire correctement

    • Partager sur Facebook
    • Partager sur Twitter
      18 février 2021 à 18:26:13

      Il n'y a pas vraiment de connexion en UDP.

      https://docs.microsoft.com/fr-fr/dotnet/api/system.net.sockets.udpclient.connect?view=net-5.0

      Faire un "catch (Exception ex)", c'est une très très mauvaise idée.

      Moi, je créerai la socket en réception en premier et j'utiliserai l'asynchronisme pour pouvoir attendre de recevoir la réponse en même temps que de faire l'envoi du packet UDP de damande.

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

      Retry Logic

      × 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