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; } }
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(); }
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); }
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); }
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; }
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(); }
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(); } } }
private void _versCoucheReseau(Paquet paquet) { m_reseauStreamOut.Add(paquet); }
private void _origineCoucheReseau(out Paquet paquet) { paquet = this.m_reseauStreamIn.Take(); }
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(); } } }