Пример #1
0
            private void _ecrireFichier()
            {
                try
                {
                    //Paquet p = m_paquetsIn.Take();
                    //File.WriteAllBytes(m_path, p.Buffer);

                    //log stuff
                    string log_str = "_ecrireFichier T=" + Thread.CurrentThread.Name + " content to write: " + Environment.NewLine;
                    foreach (Paquet pA in m_paquetsIn)
                    {
                        log_str += pA.ToString() + Environment.NewLine;
                    }

                    Logging.log(TypeConsolePrint.ReceptionPath, log_str);
                    Paquet p = m_paquetsIn.Take();
                    using (var fs = new FileStream(m_path, FileMode.Append, FileAccess.Write))
                    {
                        fs.Write(p.Buffer, 0, Convert.ToInt32(p.Taille));
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception _ecrireFichier from Thread.Name {0} for Paquet {1},", Thread.CurrentThread.Name, m_paquetsIn.ToString());
                    Console.WriteLine("except {0}", ex);
                    throw ex;
                }
            }
Пример #2
0
            private void _lireFichier()
            {
                using (FileStream fs = File.OpenRead(m_path))
                {
                    int nbOctetsALire = (int)fs.Length;

                    while (nbOctetsALire > 0)
                    {
                        if (!m_estActive)
                        {
                            Thread.Sleep(500);
                            continue;
                        }
                        else
                        {
                            Paquet paquet = new Paquet();

                            int read = fs.Read(paquet.Buffer, 0, (int)paquet.Taille);

                            m_paquetsOut.Add(paquet);
                            m_evenementStream.Add(TypeEvenement.CoucheReseauPrete);

                            if (read <= 0)
                            {
                                break;
                            }

                            nbOctetsALire -= read;
                        }
                    }
                }
                Terminer();
            }
Пример #3
0
        private void _versCoucheReseau(Paquet paquet)
        {
            string log_str = "_versCoucheReseau from Thread.Name: " + Thread.CurrentThread.Name + " paquets to write: " + paquet.ToString();

            Logging.log(TypeConsolePrint.ReceptionPath, log_str);

            m_reseauStreamOut.Add(paquet);
            m_eventStream.Add(TypeEvenement.PaquetRecu);
        }
Пример #4
0
        private void _origineCoucheReseau(out Paquet paquet)
        {
            //We do have bytes in paquet after this
            paquet = this.m_reseauStreamIn.Take();

            string log_str = "_versCoucheReseau from Thread.Name: " + Thread.CurrentThread.Name + " paquets to write: " + paquet.ToString();

            Logging.log(TypeConsolePrint.SendingPath, log_str);
        }
Пример #5
0
        public Trame(byte noSeq, byte typeTrame, byte[] data)
        {
            /*New constructor to  build a trame from its binrep coming form physical layer*/
            _taille    = Constants.N;
            NoSequence = Convert.ToUInt32(noSeq);
            TypeTrame ty = (TypeTrame)Convert.ToUInt32(typeTrame);

            Type = ty;
            Paquet pq = new Paquet();

            pq.Buffer = data;
            Info      = pq;
        }
Пример #6
0
            private void _lireFichier()
            {
                using (FileStream fs = File.OpenRead(m_path))
                {
                    int nbOctetsALire = (int)fs.Length;

                    while (nbOctetsALire > 0)
                    {
                        if (!m_estActive)
                        {
                            Thread.Sleep(500);
                            continue;
                        }
                        else
                        {
                            Paquet paquet = new Paquet();

                            int read = fs.Read(paquet.Buffer, 0, (int)paquet.Taille);

                            m_paquetsOut.Add(paquet);
                            //Adding events - we have a file to send (e.g. CoucheReseauPrete)
                            //What happens after I add CCoucheReseauPrete to the event stream? Who "knows" about that?
                            m_evenementStream.Add(TypeEvenement.CoucheReseauPrete);

                            if (read <= 0)
                            {
                                break;
                            }

                            nbOctetsALire -= read;
                        }
                    }
                }

                //log stuff
                string log_str = "_lireFichier T=" + Thread.CurrentThread.Name + " content from file: " + Environment.NewLine;

                foreach (Paquet p in m_paquetsOut)
                {
                    log_str += p.ToString() + Environment.NewLine;
                }

                Logging.log(TypeConsolePrint.SendingPath, log_str);

                Terminer();
            }
Пример #7
0
        public void Run()
        {
            uint ackAttendu;                                         /* Bord inf. fenêtre émetteur */
            uint prochaineTramePourEnvoie;                           /* Bord sup. fenêtre émetteur + 1 */
            uint trameAttendue;                                      /* Bord inf. fenêtre récepteur */
            uint tropLoin;                                           /* Bord sup. fenêtre récepteur + 1 */
            uint index;                                              /* Index d'accès au tampon */

            Trame r = new Trame();                                   /* Variable temporaire */

            Paquet[]      outTampon = new Paquet[Constants.NB_BUFS]; /* Tampon pour le flux de données en sortie */
            Paquet[]      inTampon  = new Paquet[Constants.NB_BUFS]; /* Tampon pour le flux de données en entrée */
            bool[]        estArrive = new bool[Constants.NB_BUFS];   /* Tampon occupé ou non */
            uint          nbTampons;                                 /* Nombre de tampons sortie en cours d'utilisation */
            TypeEvenement evenement;

            /* Initialisation */
            _activerCoucheReseau();
            this.m_coucheReseau.Partir();

            ackAttendu = 0;
            prochaineTramePourEnvoie = 0;
            trameAttendue            = 0;
            tropLoin = Constants.NB_BUFS;

            /* Au départ, pas de paquets en mémoire */
            nbTampons = 0;
            for (index = 0; index < Constants.NB_BUFS; index++)
            {
                estArrive[index] = false;
            }

            while (!this.m_signal.IsComplete)
            {
                evenement = _attendreEvenement();

                switch (evenement)
                {
                case TypeEvenement.CoucheReseauPrete:      /* Accepter et transmettre la nouvelle trame */
                    /* Agrandit la fenêtre */
                    ++nbTampons;
                    /* Acquisition */
                    _origineCoucheReseau(out outTampon[prochaineTramePourEnvoie % Constants.NB_BUFS]);
                    /* Transmission */
                    _envoyerTrame(TypeTrame.data, prochaineTramePourEnvoie, trameAttendue, outTampon);
                    /* Avance bord fenêtre */
                    ++prochaineTramePourEnvoie;
                    break;

                case TypeEvenement.ArriveeTrame:           /* Arrivé d'une trame de données ou de contrôle */
                    /* Acquisition */
                    _origineCouchePhysique(out r);

                    if (r.Type == TypeTrame.data)
                    {
                        /* C'est une trame de données correctes */
                        if ((r.NoSequence != trameAttendue) && noNAK)
                        {
                            _envoyerTrame(TypeTrame.nak, 0, trameAttendue, outTampon);
                        }
                        else
                        {
                            this.m_ackTimer.StartACKTimer();
                        }

                        if (EstAuMillieu(trameAttendue, r.NoSequence, tropLoin) && (estArrive[r.NoSequence % Constants.NB_BUFS] == false))
                        {
                            /* On doit accepter les trames dans n'importe quel ordre */

                            /* Tampon remplis avec les données */
                            estArrive[r.NoSequence % Constants.NB_BUFS] = true;
                            inTampon[r.NoSequence % Constants.NB_BUFS]  = r.Info;

                            while (estArrive[trameAttendue % Constants.NB_BUFS])
                            {
                                /* Passage trames et avancée fenêtre */
                                _versCoucheReseau(inTampon[trameAttendue % Constants.NB_BUFS]);
                                noNAK = true;
                                estArrive[trameAttendue % Constants.NB_BUFS] = false;

                                ++trameAttendue;         /* Avance bord inf. fenêtre récepteur */
                                ++tropLoin;              /* Avance bord haut fenêtre récepteur */
                                this.m_ackTimer.StartACKTimer();
                            }
                        }
                    }

                    if ((r.Type == TypeTrame.nak) && EstAuMillieu(ackAttendu, (r.ACK + 1) % (Constants.MAX_SEQ + 1), prochaineTramePourEnvoie))
                    {
                        _envoyerTrame(TypeTrame.data, (r.ACK + 1) % (Constants.MAX_SEQ + 1), trameAttendue, outTampon);
                    }

                    while (EstAuMillieu(ackAttendu, r.ACK, prochaineTramePourEnvoie))
                    {
                        /* Traitement ACK superposé */
                        --nbTampons;
                        /* Trame arrivée intacte */
                        this.m_chrono.StopChrono(ackAttendu % Constants.NB_BUFS);
                        /* Avance bord bas fenêtre émetteur */
                        ++ackAttendu;
                    }
                    break;

                case TypeEvenement.CkSumErr:
                    if (noNAK)
                    {
                        _envoyerTrame(TypeTrame.nak, 0, trameAttendue, outTampon);       /* Trame altérée */
                    }
                    break;

                case TypeEvenement.Timeout:
                    _envoyerTrame(TypeTrame.data, this.m_chrono.PlusVieilleTrameStream.Take(), trameAttendue, outTampon);
                    break;

                case TypeEvenement.ACKTimeout:
                    /* Timer ACK expiré => Enovie ACK */
                    _envoyerTrame(TypeTrame.ack, 0, trameAttendue, outTampon);
                    break;
                }

                if (nbTampons < Constants.NB_BUFS)
                {
                    _activerCoucheReseau();
                }
                else
                {
                    _desactiverCoucheReseau();
                }
            }
        }
Пример #8
0
 private void _versCoucheReseau(Paquet paquet)
 {
     m_reseauStreamOut.Add(paquet);
 }
Пример #9
0
 private void _origineCoucheReseau(out Paquet paquet)
 {
     paquet = this.m_reseauStreamIn.Take();
 }
Пример #10
0
        public void Run()
        {
            uint ackAttendu;                                         /* Bord inf. fenêtre émetteur */
            uint prochaineTramePourEnvoie;                           /* Bord sup. fenêtre émetteur + 1 */
            uint trameAttendue;                                      /* Bord inf. fenêtre récepteur */
            uint tropLoin;                                           /* Bord sup. fenêtre récepteur + 1 */
            uint index;                                              /* Index d'accès au tampon */

            Trame temp_trame = new Trame();                          /* Variable temporaire */

            Paquet[]      outTampon = new Paquet[Constants.NB_BUFS]; /* Tampon pour le flux de données en sortie */
            Paquet[]      inTampon  = new Paquet[Constants.NB_BUFS]; /* Tampon pour le flux de données en entrée */
            bool[]        estArrive = new bool[Constants.NB_BUFS];   /* Tampon occupé ou non */
            uint          nbTampons;                                 /* Nombre de tampons sortie en cours d'utilisation */
            TypeEvenement evenement;

            /* Initialisation */
            _activerCoucheReseau();
            this.m_coucheReseau.Partir();

            ackAttendu = 0;
            prochaineTramePourEnvoie = 0;
            trameAttendue            = 0;
            tropLoin = Constants.NB_BUFS;

            /* Au départ, pas de paquets en mémoire */
            nbTampons = 0;
            for (index = 0; index < Constants.NB_BUFS; index++)
            {
                estArrive[index] = false;
            }

            //TO DO: is this signal ever turned off? Maybe this is why I get multiple times the same file at the end?
            while (!this.m_signal.IsComplete)
            {
                evenement = _attendreEvenement();

                switch (evenement)
                {
                case TypeEvenement.CoucheReseauPrete:      /* Accepter et transmettre la nouvelle trame */
                    /* Agrandit la fenêtre */
                    ++nbTampons;
                    /* Acquisition. Out means we pass by reference, not by value */
                    _origineCoucheReseau(out outTampon[prochaineTramePourEnvoie % Constants.NB_BUFS]);
                    /* Transmission */
                    _envoyerTrame(TypeTrame.data, prochaineTramePourEnvoie, trameAttendue, outTampon);
                    /* Avance bord fenêtre */
                    ++prochaineTramePourEnvoie;
                    break;

                case TypeEvenement.ArriveeTrame:           /* Arrivé d'une trame de données ou de contrôle */
                    /* Acquisition - _origineCouchePhysique returns the trame it received */
                    _origineCouchePhysique(out temp_trame);

                    if (temp_trame.Type == TypeTrame.data)
                    {
                        /* C'est une trame de données correctes */

                        /*This doesn't work. When we arrive at the end of the # of frames for that paquet (say, there are 4 frames in
                         * total), then we send a NAK. However, tramaAttendue (#5 in this example) will simply never come as there are only
                         * 4... or will the NAK simply be ignored then?*/
                        if ((temp_trame.NoSequence != trameAttendue) && noNAK)
                        {
                            _envoyerTrame(TypeTrame.nak, 0, trameAttendue, outTampon);
                        }
                        else
                        {
                            this.m_ackTimer.StartACKTimer();
                        }

                        if (EstAuMillieu(trameAttendue, temp_trame.NoSequence, tropLoin) && (estArrive[temp_trame.NoSequence % Constants.NB_BUFS] == false))
                        {
                            /* On doit accepter les trames dans n'importe quel ordre */

                            /* Tampon remplis avec les données */
                            estArrive[temp_trame.NoSequence % Constants.NB_BUFS] = true;
                            inTampon[temp_trame.NoSequence % Constants.NB_BUFS]  = temp_trame.Info;

                            while (estArrive[trameAttendue % Constants.NB_BUFS])
                            {
                                /* Passage trames et avancée fenêtre */
                                _versCoucheReseau(inTampon[trameAttendue % Constants.NB_BUFS]);
                                noNAK = true;
                                estArrive[trameAttendue % Constants.NB_BUFS] = false;

                                ++trameAttendue;         /* Avance bord inf. fenêtre récepteur */
                                ++tropLoin;              /* Avance bord haut fenêtre récepteur */
                                this.m_ackTimer.StartACKTimer();
                            }
                        }


                        //TO DO - seems we don't do anything with it
                    }

                    if ((temp_trame.Type == TypeTrame.nak) && EstAuMillieu(ackAttendu, (temp_trame.ACK + 1) % (Constants.MAX_SEQ + 1), prochaineTramePourEnvoie))
                    {
                        _envoyerTrame(TypeTrame.data, (temp_trame.ACK + 1) % (Constants.MAX_SEQ + 1), trameAttendue, outTampon);
                    }

                    while (EstAuMillieu(ackAttendu, temp_trame.ACK, prochaineTramePourEnvoie))
                    {
                        /* Traitement ACK superposé */
                        --nbTampons;
                        /* Trame arrivée intacte */
                        this.m_chrono.StopChrono(ackAttendu % Constants.NB_BUFS);
                        /* Avance bord bas fenêtre émetteur */
                        ++ackAttendu;
                    }
                    break;

                case TypeEvenement.CkSumErr:
                    if (noNAK)
                    {
                        _envoyerTrame(TypeTrame.nak, 0, trameAttendue, outTampon);       /* Trame altérée */
                    }
                    break;

                case TypeEvenement.Timeout:
                    _envoyerTrame(TypeTrame.data, this.m_chrono.PlusVieilleTrameStream.Take(), trameAttendue, outTampon);
                    break;

                case TypeEvenement.ACKTimeout:
                    /* Timer ACK expiré => Enovie ACK */
                    _envoyerTrame(TypeTrame.ack, 0, trameAttendue, outTampon);
                    break;

                case TypeEvenement.PaquetRecu:
                    /* Have a package - send that to Couche Reseau */
                    m_coucheReseau.ecrire_paquet();
                    break;
                }

                if (nbTampons < Constants.NB_BUFS)
                {
                    _activerCoucheReseau();
                }
                else
                {
                    _desactiverCoucheReseau();
                }
            }
        }