//obliczanie przeplywnosci public static double PrzeplywnoscSystemu() { double wynik = ((float)Siec.Odebrane()) / ((Program.czasSymulacji - czasFazyPoczatkowej.Last()) / 1000); Przeplywnosc += wynik; return(wynik); }
//Konstruktor z parametrem wejsciowym id public Pakiet(int id) { Id = id; LiczbaRetransmisji = 0; FlagaKolizji = false; ACK = false; CzasCTPk = Siec.CzasCTPk(); }
public static void ZerujPrzedFazaPoczatkowa() { SrednieOpoznienie.Clear(); SrednieOczekiwanie.Clear(); StopaBledu.Clear(); LiczbaRetransmisji.Clear(); Siec.ZerujOdbiorniki(); }
public static void ZerujStatystyki() { Siec.ZerujSiec(); SrednieOpoznienie.Clear(); SrednieOczekiwanie.Clear(); StopaBledu.Clear(); LiczbaRetransmisji.Clear(); odliczanieDoFazyPoczatkowej = 0; wyznaczonoFaze = false; }
//Wyswitlanie statystyk dla 1 symulacji public static void Wyswietl() { Siec.StatystykiSieci(); Console.BackgroundColor = ConsoleColor.DarkGray; Console.WriteLine("Średnia pakietowa stopa błędu wynosi: {0}", PakietowaStopaBledow()); Console.WriteLine("Maksymalna pakietowa stopa błedu wynosi: {0}", MaxStopaBledu()); Console.WriteLine("Średnia liczba retransmisji wynosi: {0}", SrRetransmisji()); Console.WriteLine("Przepływność systemu wynosi:{0} pakiet/sek", PrzeplywnoscSystemu()); Console.WriteLine("Średnie opóźnienie wynosi: {0} ms", SrOpoznienie()); Console.WriteLine("Średnie oczekiwanie wynosi: {0} ms", SrOczekiwanie()); Console.ResetColor(); }
//Funkcja wywolywana na koncu symulacji, zbiera statystyki danej symulacji public static void StatystykiSieci() { Siec.StopaBledu(); Siec.IloscRetransmisji(); }
static void Main(string[] args) { CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); Ziarno.Generuj(); int liczbaSymulacji = Program.liczbaSymulacji; Console.WriteLine("Wybierz opcje wyswietlania informacji o przebiegu programu: "); Console.WriteLine("{0} - logi wylaczone"); Console.WriteLine("{1} - logi wlaczone"); int zmiennaLogi = int.Parse(Console.ReadLine()); switch (zmiennaLogi) { case 0: Program.logi = false; break; case 1: Program.logi = true; break; default: Console.WriteLine("Podano nieoczekiwana liczbe"); break; } Console.WriteLine("Wybierz opcje krokowego wykonywania petli glownej: "); Console.WriteLine("{0} - krokowo"); Console.WriteLine("{1} - ciagle"); int zmiennaKrokowo = int.Parse(Console.ReadLine()); switch (zmiennaKrokowo) { case 0: Program.symulacjaKrokowa = true; break; case 1: Program.symulacjaKrokowa = false; break; default: Console.WriteLine("Podano nieoczekiwana liczbe"); break; } Console.WriteLine("Wybierz opcje: "); Console.WriteLine("{0} - program dla ustalonych w raporcie parametrow"); Console.WriteLine("{1} - program dla nowych parametrow"); int zmiennaParametry = int.Parse(Console.ReadLine()); switch (zmiennaParametry) { case 0: Console.WriteLine("Rozpoczynam wykonywanie programu, za chwilę na ekranie pojawią się statystyki pierwszej symulacji..."); break; case 1: Console.WriteLine("Podaj wartosc lambda: "); Program.lambda = double.Parse(Console.ReadLine()); Console.WriteLine("Podaj czas symulacji w [ms]: "); Program.czasSymulacji = int.Parse(Console.ReadLine()); Console.WriteLine("Podaj liczbe symulacji: "); Program.liczbaSymulacji = int.Parse(Console.ReadLine()); Console.WriteLine("Podaj faze poczatkowa jako ilosc pakietow:"); Program.fazaPoczatkowa = int.Parse(Console.ReadLine()); break; default: Console.WriteLine("Podano nieoczekiwana liczbe"); break; } while (liczbaSymulacji > 0) { Program.zegar = 0; Siec siecSymulowana = new Siec(); while (zegar < Program.czasSymulacji) { obecnyProces = agenda.First()._proces; zegar = agenda.First()._czasZdarzenia; agenda.RemoveAt(0); obecnyProces.Execute(); if (Program.symulacjaKrokowa) { Console.ReadKey(); } } Statystyka.Wyswietl(); Console.WriteLine(); Statystyka.ZerujStatystyki(); agenda.Clear(); --liczbaSymulacji; } Statystyka.PodsumowanieStatystyk(); Ziarno.sr.Close(); Console.WriteLine("Zakonczono"); Console.ReadKey(); }
override public void Execute() { bool active = true; while (active) { switch (_faza) { //Faza 0 - aktywacja kolejnego pakietu, ustawienie go w buforze, przechodzi do //fazy 1 case 0: //tworzony jest nowy pakiet ktory zostanie dodany do buforu w chwili aktywacji new Pakiet(this.Id).Activate(Siec.UstawCGPk(this)); //dodanie istniejacego do buforu Siec.DodajDoNadawczej(this); CzasPojawienia = Program.zegar; if (Program.logi) { Console.WriteLine("Pakiet id {0} aktywuje kolejny pakiet, liczba pakietow w stacji nadawczej {1}, czas {2}", this.Id, Siec.SprawdzBufor(this), Program.zegar); } _faza = 1; break; //Faza 1 - sprawdza czy pakiet jest pierwszy w buforze, jesli //jest przechodzi do kolejnej fazy case 1: if (Siec.PierwszyPakiet(this) == this) { if (Program.logi) { Console.WriteLine("Pakiet id {0} jest pierwszy w nadajniku, czas {1}", this.Id, Program.zegar); } CzasNadania = Program.zegar; Statystyka.SrednieOczekiwanie.Add(CzasNadania - CzasPojawienia); _faza = 2; } else { active = false; } break; //Faza 2 - nasluchuje kanal co 0.5ms, jezeli kanal //jest wolny to przechodzi do fazy 3 case 2: if (Program.logi) { Console.WriteLine("Pakiet id {0} sprawdza stan kanalu, czas {1}", this.Id, Program.zegar); } if (!Lacze.KanalWolny) { if (Program.logi) { Console.WriteLine("Pakiet id {0} oczekuje na zwolnienie kanalu co 0.5ms, czas {1}", this.Id, Program.zegar); } this.Activate(0.5); active = false; } else { _faza = 3; } break; //Faza 3 - jezeli kanal jest wolny losuje liczbe i //sprawdza jej prawdopodobienstwo case 3: if (Siec.PT() <= Program.PT) { if (Program.logi) { Console.WriteLine("Pakiet id {0} ma p-stw mniejsze od 0.6 rozpoczyna transmisje, czas {1}", this.Id, Program.zegar); } _faza = 5; } else { //wait a slot if (Program.zegar % 1 == 0) //czeka 1ms do szczeliny { if (Program.logi) { Console.WriteLine("Pakiet id {0} ma p-stwo wieksze niz 0.6 wiec oczekuje do szczeliny, czas {1}", this.Id, Program.zegar); } _faza = 4; this.Activate(1.0); active = false; } else { if (Program.logi) { Console.WriteLine("Pakiet id {0} ma p-stwo wieksze niz 0.6 wiec oczekuje do szczeliny, czas {1}", this.Id, Program.zegar); } _faza = 4; this.Activate(1 - (Program.zegar % 1)); //odczekuje do szczeliny active = false; } } break; case 4: if (!Lacze.KanalWolny) { if (Program.logi) { Console.WriteLine("Pakiet id {0} sprawdza czy kanal jest wolny 1ms i wraca do odpytywania co 0.5ms, czas {1}", this.Id, Program.zegar); } _faza = 2; //wraca do odpytywania co 0.5ms this.Activate(1.0); active = false; } else { if (Program.logi) { Console.WriteLine("Pakiet id {0} wraca do losowania liczby, czas {1}", this.Id, Program.zegar); } _faza = 3; } break; //faza 5 - sprawdzanie kanalu i kolizji. Jesli wystapila przechodzi do fazy 6, //jesli nie, dodaje pakiet do kanalu i rozpoczyna transmisje case 5: if (Program.zegar % 1 == 0) { if (Program.logi) { Console.WriteLine("Pakiet id {0} rozpoczal transmisje w pelnej szczelinie, czas {1}. Planowany czas transmisji {2}", this.Id, Program.zegar, this.CzasCTPk); } if (Lacze.Kolizja()) { if (Program.logi) { Console.WriteLine("Pakiet id {0} wykryl kolizje, czas {1}", this.Id, Program.zegar); } Lacze.UstawFlagiKolizji(); this.FlagaKolizji = true; } Lacze.DodajDoKanalu(this); _faza = 6; this.Activate(0.0, 1); active = false; } else //jesli nie to odczekaj czas do następnej szczeliny i ponownie sprawdz czy kolizja { if (Program.logi) { Console.WriteLine("Pakiet id {0} czeka na poczatek szczeliny, czas {1}", this.Id, Program.zegar); } this.Activate((1 - (Program.zegar % 1))); active = false; } break; //Faza 6 - transmisja case 6: if (Program.logi) { Console.WriteLine("Pakiet id {0} zajal kanal, czas {1}", this.Id, Program.zegar); } Lacze.KanalWolny = false; _faza = 8; this.Activate(CzasCTPk); active = false; break; //Faza 7 - retransmisja case 7: if (Program.logi) { Console.WriteLine("Pakiet id {0} rozpoczyna retransmisje, czas {1}", this.Id, Program.zegar); } ++this.LiczbaRetransmisji; if (this.LiczbaRetransmisji < Program.liczbaRetransmisji) { double czas = Siec.R(this) * CzasCTPk; this.FlagaKolizji = false; _faza = 2; this.Activate(czas); active = false; } else { //usuwa pakiet z systemu if (Program.logi) { Console.WriteLine("Przekroczono LR wiec usuwam pakiet z systemu"); } Siec.StraconePakiety(this); Siec.UsunZNadawczej(this); if (Siec.SprawdzBufor(this) != 0) { Siec.PierwszyPakiet(this).Activate(0.0); } active = false; } break; //Faza 8 - sprawdzenie czy wystąpiła kolizja case 8: if (this.FlagaKolizji) { Console.BackgroundColor = ConsoleColor.Red; if (Program.logi) { Console.WriteLine("Pakiet id {0} wystaplia kolizja, czas {1}", this.Id, Program.zegar); } Console.ResetColor(); Lacze.UsunZKanalu(this); if (!Lacze.Kolizja()) { Lacze.KanalWolny = true; } _faza = 7; } else { _faza = 9; ACK = true; Activate(1.0); active = false; } break; //Faza 9 - odbior pakietu case 9: Siec.DodajDoOdbiorczej(this); if (!Statystyka.wyznaczonoFaze) { ++Statystyka.odliczanieDoFazyPoczatkowej; Statystyka.ZerujPrzedFazaPoczatkowa(); if (Statystyka.odliczanieDoFazyPoczatkowej == Program.fazaPoczatkowa) { Statystyka.czasFazyPoczatkowej.Add(Program.zegar); Statystyka.wyznaczonoFaze = true; } } this.CzasOdbioru = Program.zegar; Statystyka.SrednieOpoznienie.Add((CzasOdbioru - CzasPojawienia)); Lacze.UsunZKanalu(this); Siec.UsunZNadawczej(this); Lacze.KanalWolny = true; _wykonano = true; if (Siec.SprawdzBufor(this) != 0) { Siec.PierwszyPakiet(this).Activate(0.0); } active = false; Console.BackgroundColor = ConsoleColor.DarkGreen; if (Program.logi) { Console.WriteLine("Pakiet id {0} zapisal sie w stacji odbiorczej, czas {1}", this.Id, Program.zegar); } Console.ResetColor(); break; default: break; } } }