Exemple #1
0
        //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();
 }
Exemple #3
0
 public static void ZerujPrzedFazaPoczatkowa()
 {
     SrednieOpoznienie.Clear();
     SrednieOczekiwanie.Clear();
     StopaBledu.Clear();
     LiczbaRetransmisji.Clear();
     Siec.ZerujOdbiorniki();
 }
Exemple #4
0
 public static void ZerujStatystyki()
 {
     Siec.ZerujSiec();
     SrednieOpoznienie.Clear();
     SrednieOczekiwanie.Clear();
     StopaBledu.Clear();
     LiczbaRetransmisji.Clear();
     odliczanieDoFazyPoczatkowej = 0;
     wyznaczonoFaze = false;
 }
Exemple #5
0
 //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();
 }
Exemple #6
0
 //Funkcja wywolywana na koncu symulacji, zbiera statystyki danej symulacji
 public static void StatystykiSieci()
 {
     Siec.StopaBledu();
     Siec.IloscRetransmisji();
 }
Exemple #7
0
        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;
                }
            }
        }