/// <summary>
        /// Funkcja słuząca do zamiany nagłówka, uwzgledniajaca "-1" w czestotliwosci
        /// </summary>
        /// <param name="message">Wiadomość odebrana w postaci tablicy bajtów</param>
        /// <returns></returns>
        public byte[] changePackageHeader2(byte[] message, ref CommutationField commutationField)
        {
            byte[] msg = new byte[64];
            msg = message;
            Package p = new Package(msg);

            //Jak czestotliwosc jest rowna -1
            if (p.frequency == -1)
            {
                BorderNodeCommutationTableRow row = new BorderNodeCommutationTableRow();

                row = this.FindRow(p.IP_Source.ToString(), p.portNumber, p.IP_Destination.ToString());

                p.changeBand(row.band);
                p.changeFrequency(row.frequency);
                p.changeModulationPerformance(row.modulationPerformance);
                p.changeBitRate(row.bitRate);
                p.changePort(row.Port);

                msg = p.toBytes();
            }
            //Jak nie bylo -1, to odwolujemy sie do tabeli komutacji, ale nie brzegowej
            else
            {
                msg = commutationField.commutationTable.changePackageHeader(msg);
            }


            return(msg);
        }
        public void testAddBorderNodeCommutationTableRow()
        {
            IPAddress IP_IN                 = IPAddress.Parse("123.123.123.123");
            short     port_in               = 1;
            short     band                  = 2;
            short     frequency             = 3;
            short     modulationPerformance = 4;
            short     bitRate               = 5;
            IPAddress IPSocketOut           = IPAddress.Parse("234.234.234.234");
            short     socketPort            = 6;
            short     hopsNumber            = 7;

            //stworzenie nowego rzedu tablicy komutacji routera brzegowego
            BorderNodeCommutationTableRow row = new BorderNodeCommutationTableRow(IP_IN.ToString(), port_in, band, frequency,
                                                                                  modulationPerformance, bitRate, IPSocketOut.ToString(), socketPort, hopsNumber);

            //nowa tabela komutacji wezla brzegowego
            BorderNodeCommutationTable table = new BorderNodeCommutationTable();

            //Dodanie wiersza do tabeli komutacji wezla brzegowego
            table.Table.Add(row);

            //Powinny byc takie same
            Assert.AreEqual(row, table.Table[0]);
        }
        public void testFindRow1()
        {
            string IP   = "127.0.0.1";
            short  port = 2;

            //Nowa tabela
            BorderNodeCommutationTable table = new BorderNodeCommutationTable();

            //Nowy rząd
            BorderNodeCommutationTableRow row = new BorderNodeCommutationTableRow(IP, port, 0, 0, 0, 0, "0.0.0.0", 0, 0);

            //Dodanie rzedu do tabeli
            table.Table.Add(row);

            //    Assert.AreEqual(row, table.FindRow(IP, port));

            // Assert.AreEqual(0, table.FindIndex(IP, port));
        }
Beispiel #4
0
        /// <summary>
        /// Funkcja odnajdujaca rzad, w ktorym jest okreslone IP i nr portu
        /// </summary>
        /// <param name="IP_IN"></param>
        /// <param name="port_in"></param>
        /// <returns></returns>
        public BorderNodeCommutationTableRow FindRow(string IP_IN, short port_in, string IP_Destination)
        {
            //Jeden rzad tablicy komutacji
            BorderNodeCommutationTableRow borderRow = null;

            try
            {
                IPAddress IP = IPAddress.Parse(IP_IN);

                //Wyszukiwanie takiego rzedu, ktory ma podane IP_IN i port_in
                borderRow = this.Table.Find(row => (row.IP_IN.ToString() == IP_IN) && (row.port_in == port_in) && (row.IP_Destination.ToString() == IP_Destination));

                return(borderRow);
            }
            catch (Exception E)
            {
                return(borderRow);
            }
        }
Beispiel #5
0
        /// <summary>
        /// Funkcja słuząca do zamiany nagłówka
        /// </summary>
        /// <param name="message">Wiadomość odebrana w postaci tablicy bajtów</param>
        /// <returns></returns>
        public byte[] changePackageHeader(byte[] message)
        {
            byte[] msg = new byte[64];
            msg = message;
            Package p = new Package(msg);

            BorderNodeCommutationTableRow row = new BorderNodeCommutationTableRow();

            row = this.FindRow(p.IP_Source.ToString(), p.portNumber, p.IP_Destination.ToString());

            p.changeBand(row.band);
            p.changeFrequency(row.frequency);
            p.changeModulationPerformance(row.modulationPerformance);
            p.changeBitRate(row.bitRate);
            p.changePort(row.Port);

            msg = p.toBytes();

            return(msg);
        }
        public void testGenerateCharacteristicInfo()
        {
            IPAddress IP_IN                 = IPAddress.Parse("123.123.123.123");
            short     port_in               = 1;
            short     band                  = 2;
            short     frequency             = 3;
            short     modulationPerformance = 4;
            short     bitRate               = 5;
            IPAddress IPSocketOut           = IPAddress.Parse("234.234.234.234");
            short     socketPort            = 6;
            short     hopsNumber            = 7;

            //stworzenie nowego rzedu tablicy komutacji routera brzegowego
            BorderNodeCommutationTableRow row = new BorderNodeCommutationTableRow(IP_IN.ToString(), port_in, band, frequency,
                                                                                  modulationPerformance, bitRate, IPSocketOut.ToString(), socketPort, hopsNumber);

            //pozostale dane do pakietu, korzysta tez z danych od pakietu
            string    inscription      = "Mam malo wody";
            short     portNumber       = port_in;
            IPAddress IP_Source        = IP_IN;
            IPAddress IP_Destination   = IPSocketOut;
            short     packageNumber    = 5;
            short     usableInfoLength = (short)inscription.Length;
            short     ID = 17;
            short     howManyPackages = 1;

            //Stworzenie pakietu
            Package P = new Package(inscription, portNumber, IP_Destination.ToString(), IP_Source.ToString(), usableInfoLength, packageNumber, 0, 0, 0, 0, ID, howManyPackages);

            BorderNodeCommutationTable table = new BorderNodeCommutationTable();

            table.Table.Add(row);

            Package P2 = new Package(RouterClientPortIn.GenerateCharacteristicInfo(P.toBytes(), ref table));

            Assert.AreEqual(row.frequency, P2.frequency);
            Assert.AreEqual(row.band, P2.band);
            Assert.AreEqual(row.bitRate, P2.bitRate);
            Assert.AreEqual(row.modulationPerformance, P2.modulationPerformance);
        }
Beispiel #7
0
        /// <summary>
        /// Funkcja słuząca do zamiany nagłówka, uwzgledniajaca "-1" w czestotliwosci
        /// </summary>
        /// <param name="message">Wiadomość odebrana w postaci tablicy bajtów</param>
        /// <returns></returns>
        public byte[] changePackageHeader2(byte[] message, ref CommutationField commutationField)
        {
            byte[] msg = new byte[64];
            msg = message;
            Package p = new Package(msg);

            //Jak czestotliwosc jest rowna -1
            if (p.frequency == -1)
            {
                BorderNodeCommutationTableRow row = new BorderNodeCommutationTableRow();

                row = this.FindRow(p.IP_Source.ToString(), p.portNumber, p.IP_Destination.ToString());

                //Gdy udalo sie znalezc wpis w tabeli, podmien pola naglowka
                if (row != null)
                {
                    p.changeBand(row.band);
                    p.changeFrequency(row.frequency);
                    p.changeModulationPerformance(row.modulationPerformance);
                    p.changeBitRate(row.bitRate);
                    // p.changePort(row.Port);
                }
                //Jak sie nie udalo, to wpisz -2 do czestotliwosci
                else
                {
                    //-2 oznacza "upusc pakiet"
                    p.changeFrequency(-2);
                }

                msg = p.toBytes();
            }
            //Jak nie bylo -1, to odwolujemy sie do tabeli komutacji, ale nie brzegowej

            msg = commutationField.commutationTable.changePackageHeader(msg);



            return(msg);
        }
        private void setRouting(string [] message)
        {
            string address = message[0];

            if (message[1] == MessageNames.CONNECTION_TEARDOWN)
            {
                if (message[3] == "CC")
                {
                    short frequency = Int16.Parse(message[10]);
                    short port_In   = Int16.Parse(message[5]);
                    short port_Out  = Int16.Parse(message[7]);



                    CommutationTableRow rowToDelete = new CommutationTableRow();
                    rowToDelete = commutationTable.FindRow(Convert.ToInt16(message[10]), Convert.ToInt16(message[5]));
                    commutationTable.Table.Remove(rowToDelete);

                    string responseMessage = System.Configuration.ConfigurationManager.AppSettings["UDP" + numberOfRouter] + "#" + MessageNames.CONNECTION_TEARDOWN + "#OK" + "#" + "CC#";
                    SendingMessageCC(address, responseMessage);
                    Console.WriteLine("[" + Timestamp.generateTimestampRCC() + "] Message  delete from table  {0} frequency {1} port_in {2} port_out {3}", "COMUTATION", frequency, port_In, port_Out);
                }
                else if (message[3] == "BORDERTABLE")
                {
                    string responseMessage = System.Configuration.ConfigurationManager.AppSettings["UDP" + numberOfRouter] + "#" + MessageNames.CONNECTION_TEARDOWN + "#OK" + "#" + "CC#";


                    BorderNodeCommutationTableRow newRow = new BorderNodeCommutationTableRow();
                    //IP source--IP destination--czestotliwosc
                    newRow = borderNodeCommutationTable.FindRow(message[4], message[6], Int16.Parse(message[7]));
                    borderNodeCommutationTable.Table.Remove(newRow);
                    // SendingMessageCC(address, responseMessage);

                    Console.WriteLine("[" + Timestamp.generateTimestampRCC() + "] Message  delete from table  {0} frequency {1} address source: {2} address destination {3}", "BORDER_NODE_COMUTATION", message[7], message[4], message[6]);
                }
            }
            else if (message[1] == MessageNames.CONNECTION_REQUEST)
            {
                if (message[3] == "CC")
                {
                    Console.WriteLine("[" + Timestamp.generateTimestampRCC() + "] Received message filling Commutation Table  from CC " + message[0]);

                    short frequency = Int16.Parse(message[10]);
                    short port_In   = Int16.Parse(message[5]);
                    short port_Out  = Int16.Parse(message[7]);



                    CommutationTableRow commuteRow = new CommutationTableRow(frequency, port_In, frequency, port_Out);
                    commutationTable.Table.Add(commuteRow);

                    string responseMessage = System.Configuration.ConfigurationManager.AppSettings["UDP" + numberOfRouter] + "#" + MessageNames.CONNECTION_REQUEST + "#OK" + "#" + "CC#";
                    SendingMessageCC(address, responseMessage);
                    Console.WriteLine("[" + Timestamp.generateTimestampRCC() + "] Message  new registry to table  {0} ", "COMUTATION_TABLE" +
                                      " Frequency: " + message[10] + " port_in: " + message[5] + " port_out: " + message[7]);
                }
                else if (message[3] == "BORDERTABLE")
                {
                    Console.WriteLine("[" + Timestamp.generateTimestampRCC() + "] Received message filling BorderNodeCommutationTable  from CC " + message[0]);
                    string responseMessage = System.Configuration.ConfigurationManager.AppSettings["UDP" + numberOfRouter] + "#" + MessageNames.CONNECTION_REQUEST + "#OK" + "#" + "CC#";


                    BorderNodeCommutationTableRow newRow = new BorderNodeCommutationTableRow(
                        message[4], Convert.ToInt16(message[5]), Convert.ToInt16(1), Convert.ToInt16(message[7]), Convert.ToInt16(7),
                        Convert.ToInt16(1), message[6], Convert.ToInt16(2), Convert.ToInt16(1));
                    borderNodeCommutationTable.Table.Add(newRow);
                    // SendingMessageCC(address, responseMessage);
                    Console.WriteLine("[" + Timestamp.generateTimestampRCC() + "] Message  new registry to table  {0} ", "BORDER_NODE_COMUTATION " +
                                      "Frequency: " + message[7] + " port_in " + message[5]);
                }
            }
        }
Beispiel #9
0
        public void fillingTable(string line, Socket socketsending, string key)
        {
            //Znaki oddzielające poszczególne części żądania klienta.
            char[] delimiterChars = { '#' };
            //Podzielenie żądania na tablicę stringów.
            string[] words;


            words = line.Split(delimiterChars);
            switch (words[0])
            {
            case "ADD":
                switch (Int32.Parse(words[1]))
                {
                //Dodawanie wpisu do BorderComutationTable
                case 1:
                    BorderNodeCommutationTableRow newRow = new BorderNodeCommutationTableRow(
                        words[2], Convert.ToInt16(words[3]), Convert.ToInt16(words[4]), Convert.ToInt16(words[5]), Convert.ToInt16(words[6]),
                        Convert.ToInt16(words[7]), words[8], Convert.ToInt16(words[9]), Convert.ToInt16(words[10]));
                    borderNodeCommutationTable.Table.Add(newRow);
                    stateReceivedMessageFromNMS("BorderNodeCommutationTable", "ADD");
                    break;

                //Dodanie wpisu do EONTable
                case 2:
                    EONTableRowIN  eonIN      = new EONTableRowIN(Convert.ToInt16(words[2]), Convert.ToInt16(words[3]));
                    EONTableRowOut eonOut     = new EONTableRowOut(Convert.ToInt16(words[4]), Convert.ToInt16(words[5]));
                    bool           eoninbool  = eonTable.addRow(eonIN);
                    bool           eonoutbool = eonTable.addRow(eonOut);
                    if (eoninbool == false || eonoutbool == false)
                    {
                        sendingMessageCommunication(OperationConfiguration.getSetting(key, mySettings), "ERROR", socketsending);
                    }
                    else
                    {
                        stateReceivedMessageFromNMS("EONTable", "ADD");
                    }

                    break;

                //Dodanie wpisu do CommutationTable
                case 3:
                    CommutationTableRow commuteRow = new CommutationTableRow(Convert.ToInt16(words[2]),
                                                                             Convert.ToInt16(words[3]), Convert.ToInt16(words[4]), Convert.ToInt16(words[5]));
                    commutationTable.Table.Add(commuteRow);

                    stateReceivedMessageFromNMS("CommutationTable", "ADD");
                    break;

                default:
                    break;
                }
                break;

            case "DELETE":
                switch (Int32.Parse(words[1]))
                {
                //Dodawanie wpisu do BorderComutationTable
                case 1:
                    BorderNodeCommutationTableRow newRow = new BorderNodeCommutationTableRow();
                    newRow = borderNodeCommutationTable.FindRow(words[2], Convert.ToInt16(words[3]), words[4]);
                    borderNodeCommutationTable.Table.Remove(newRow);
                    stateReceivedMessageFromNMS("BorderNodeCommutationTable", "DELETE");
                    break;

                //Dodanie wpisu do EONTable
                case 2:
                    EONTableRowIN  eonIN      = new EONTableRowIN(Convert.ToInt16(words[2]), Convert.ToInt16(words[3]));
                    EONTableRowOut eonOut     = new EONTableRowOut(Convert.ToInt16(words[4]), Convert.ToInt16(words[5]));
                    bool           eoninbool  = eonTable.deleteRow(eonIN);
                    bool           eonoutbool = eonTable.deleteRow(eonOut);

                    if (eoninbool == false || eonoutbool == false)
                    {
                        sendingMessageCommunication(OperationConfiguration.getSetting(key, mySettings), "ERROR", socketsending);
                    }
                    else
                    {
                        stateReceivedMessageFromNMS("EONTable", "DELETE");
                    }

                    break;

                //Dodanie wpisu do CommutationTable
                case 3:
                    CommutationTableRow rowToDelete = new CommutationTableRow();
                    rowToDelete = commutationTable.FindRow(Convert.ToInt16(words[2]), Convert.ToInt16(words[3]));
                    commutationTable.Table.Remove(rowToDelete);
                    stateReceivedMessageFromNMS("CommutationTable", "DELETE");
                    break;

                default:
                    break;
                }
                break;

            case "TOPOLOGY":
                switch (Int32.Parse(words[1]))
                {
                case 1:
                    //Dodawanie wpisu do BorderComutationTable
                    for (int i = 0; i < borderNodeCommutationTable.Table.Count; i++)
                    {
                        byte[] table_in_bytes = null;
                        string builder        = string.Empty;
                        string port_in        = string.Empty;
                        string port_out       = string.Empty;
                        string Hops           = string.Empty;
                        string command        = string.Empty;
                        string band_out       = string.Empty;
                        string destination_IP = string.Empty;
                        string Modulation     = string.Empty;
                        string BitRate        = string.Empty;
                        string IP_IN          = string.Empty;
                        string Frequency_out  = string.Empty;
                        command        = "TOPOLOGY";
                        IP_IN          = borderNodeCommutationTable.Table[i].IP_IN.ToString();
                        port_in        = borderNodeCommutationTable.Table[i].port_in.ToString();
                        band_out       = borderNodeCommutationTable.Table[i].band.ToString();
                        Frequency_out  = borderNodeCommutationTable.Table[i].frequency.ToString();
                        Modulation     = borderNodeCommutationTable.Table[i].modulationPerformance.ToString();
                        BitRate        = borderNodeCommutationTable.Table[i].bitRate.ToString();
                        destination_IP = borderNodeCommutationTable.Table[i].IP_Destination.ToString();
                        port_out       = borderNodeCommutationTable.Table[i].Port.ToString();
                        Hops           = borderNodeCommutationTable.Table[i].hopsNumber.ToString();

                        builder = command + "#" + "1" + "#" + IP_IN + "#" + port_in + "#" + band_out + "#" + Frequency_out + "#" +
                                  Modulation + "#" + BitRate + "#" + destination_IP + "#" + port_out + "#" + Hops;

                        sendingMessageCommunication(OperationConfiguration.getSetting(key, mySettings), builder, socketsending);
                    }
                    break;

                //Dodanie wpisu do EONTable
                case 2:
                    for (int i = 0; i < eonTable.TableIN.Count; i++)
                    {
                        byte[] table_in_bytes = null;
                        string builder        = string.Empty;
                        ;
                        string command       = string.Empty;
                        string band_in       = string.Empty;
                        string frequency_out = string.Empty;
                        string band_out      = string.Empty;
                        string frequency_in  = string.Empty;
                        command = "TOPOLOGY";

                        frequency_in  = eonTable.TableIN[i].busyFrequency.ToString();
                        band_in       = eonTable.TableIN[i].busyBandIN.ToString();
                        frequency_out = eonTable.TableOut[i].busyFrequency.ToString();
                        band_out      = eonTable.TableOut[i].busyBandOUT.ToString();


                        builder = command + "#" + "2" + "#" + frequency_in + "#" + band_in + "#" + frequency_out + "#" + band_out;
                        sendingMessageCommunication(OperationConfiguration.getSetting(key, mySettings), builder, socketsending);
                    }

                    break;

                //Dodanie wpisu do CommutationTable
                case 3:
                    for (int i = 0; i < commutationTable.Table.Count; i++)
                    {
                        byte[] table_in_bytes = null;
                        string command        = string.Empty;
                        string builder        = string.Empty;
                        string port_in        = string.Empty;
                        string port_out       = string.Empty;
                        string Frequency_in   = string.Empty;
                        string frequency_out  = string.Empty;
                        command = "TOPOLOGY";
                        port_in = commutationTable.Table[i].port_in.ToString();

                        frequency_out = commutationTable.Table[i].frequency_out.ToString();
                        Frequency_in  = commutationTable.Table[i].frequency_in.ToString();
                        port_out      = commutationTable.Table[i].port_out.ToString();


                        builder = command + "#" + "3" + "#" + Frequency_in + "#" + port_in + "#" + frequency_out + "#" + port_out;

                        sendingMessageCommunication(OperationConfiguration.getSetting(key, mySettings), builder, socketsending);
                    }



                    break;

                default:
                    break;
                }
                break;

            default:
                break;
            }



            // Console.ReadKey();
        }
        /// <summary>
        /// Funkcja przetwarzajaca pakiety. Nie dziala dobrze!
        /// </summary>
        /// <param name="packageBytes"></param
        public List<Queue<byte[]>> processPackage(byte[] packageBytes)
        {
            //jezeli bufor jest prawie pelny (brakuje mu jeden pakiet)
            if (bufferIn.queue.Count == maxBuffInSize - 1)
            {
                //dodanie do bufora pakietu
                bufferIn.queue.Enqueue(packageBytes);

                //Wyprozniamy bufor wejsciowy i zapisujemy jego stan do tego listOfQUeues
                var listOfQueues = bufferIn.emptyBufferIN();

                //do zwrotu wartosci lista o maksymalnej wielkosci rownej ilosci buforow wyjsciowych
                List<Queue<byte[]>> returnListOfQueues = new List<Queue<byte[]>>();

                for (int k = 0; k < BuffersOut.Count; k++)
                {
                    returnListOfQueues.Add(new Queue<byte[]>());
                }
                //ale listOfQueues powinno miec zawsze 3 kolejki na I etapie...
                for (int i = 0; i < listOfQueues.Count; i++)
                {
                    //Jak jeden pakiet ma ustawiona czestotliwosc na -1, to jest szansa, ze wszystkie maja i 
                    //Jezeli wszystkie pakiety posiadaja -1 w czestotliwosci
                    if (Package.extractFrequency(listOfQueues[i].Peek()) == -1 &&
                        Buffer.checkIfAllPackagesFrequency(listOfQueues[i], -1))
                    {
                        //Sprawdzanie w tablicach komutacji routera i wpisywanie do naglowkow odpowiednich wpisow
                        List<Queue<byte[]>> copyList = new List<Queue<byte[]>>();
                        copyList.Add(listOfQueues[i]);

                        listOfQueues[i] = new Queue<byte[]>(borderNodeCommutationTable.changeHeaderForMessagesFromClient(
                                    (copyList[i])));

                        //Nowa, zmieniona czestotliwosc. 
                        //TODO: Na razie jest jedna, a na drugi etap trzeba bedzie przygotowac sortowanie, dzielenie i 
                        //TODO: dodawanie do konkretnych kolejek

                        //Podpatrujemy na jakas czestotliwosc z pakietu
                        short freq = Package.extractFrequency(listOfQueues[i].Peek());

                        //sprawdzamy, czy wszystkie czestotliwosci sa takie same
                        if (Package.extractFrequency(listOfQueues[i].Peek()) == freq &&
                            Buffer.checkIfAllPackagesFrequency(listOfQueues[i], freq))
                        {
                            //szukanie takiej kolejki, ze wierzchni wpis ma interesujaca nas czestotliwosc
                            var queue = listOfQueues.Find(q => Package.extractFrequency(q.Peek()) == freq);

                            //TODO: Jak sprawdzic, na ktory bufor wyjsciowy skierowac te pakiety co wczesniej mialy -1?

                            // BuffersOut.Add(new Buffer(listOfQueues[i].Count));

                            //A gdy nie udalo sie znalezc, to dodajemy elementy kolejki z wczesniejszymi "-1" do kolejki z freq
                            if (queue == null)
                            {
                                int iterator = 0;
                                iterator = listOfQueues[i].Count();
                                while (iterator > 0)
                                {
                                    //TODO: asynchronicznie dodawaj po jednym pakiecie do bufora wyjsciowego 
                                    //Zdejmowanie z jednej kolejki i dopisywanie do drugiej. Nie trzeba znowu sortowac - pakiety z 
                                    //"-1" maja prawdopodobnie inne pochodzenie
                                    queue.Enqueue(listOfQueues[i].Dequeue());
                                    iterator--;
                                }
                            }
                        }
                        else
                        {
                            //Rzucamy wyjatek gdy czestotliwosci nie sa takie same
                            throw new Exception(
                                "CommutationField.processPackage(): Zamienione czestotliwosci z -1 na inna nie sa takie same!");
                        }
                    }
                    else
                    {
                        //Sprawdzanie w tablicach komutacji routera i wpisywanie do naglowkow odpowiednich wpisow
                        List<Queue<byte[]>> copyList = new List<Queue<byte[]>>();
                        copyList.Add(listOfQueues[i]);

                        listOfQueues[i] = new Queue<byte[]>(commutationTable.changeHeaderForMessagesFromClient(
                                    (copyList[i])));

                        //Rzad tablicy komutacji, ktory odpowiada czestotliwosci i numerowi portu 
                        //var row = commutationTable.FindRow(Package.extractFrequency(joinedQueue.Peek()),
                        // Package.extractPortNumber(joinedQueue.Peek()));

                        //short frequency_out = row.frequency_out;
                        //short port_out = row.port_out;
                    }
                    //jak nie ma -1 w czestoltiwosci, to wchodzimy jeszcze raz w petle
                    //      else
                    //      {
                    //Nowa, pusta kolejka
                    Queue<byte[]> tempBuffOutQueue;

                    //Czy juz bylo kopiowane do tempa?
                    bool hasBeenCopied = false;

                    //Dla kazdego pakietu w kolejce bedzie usuwana z listOfQueues[i] i dodawana do bufora.
                    while (listOfQueues[i].Count > 0)
                    {

                        //Jezeli bufor jest przepelniony, to skopiuje do tempa cala zawartosc bufora i bufor sie
                        //wyprozni. Jezeli nie jest przepelniony, to funkcja addPackage zwroci null i wtedy
                        //temp po prostu bedzie pusty.
                        tempBuffOutQueue =
                            BuffersOut[i].addPackage(listOfQueues[i].Dequeue());

                        if (tempBuffOutQueue == null)
                            continue;
                        else
                        {
                            //Jak jeszcze nie kopiowalismy z tempa do tablicy returnListOfQueues, to kopiujemy
                            if (!hasBeenCopied)
                            {
                                //Kopiowanie do listy wyjsciowej zawartosci tempa (przez kopie!)
                                returnListOfQueues[i] = new Queue<byte[]>(tempBuffOutQueue);

                                //Petla dziala dalej, a bufor wyjsciowy pola komutacyjnego sie zapelnia.

                                hasBeenCopied = true;
                            }
                            //A jak juz kopiowalismy, dodajemy znowu zawartosc tempa na koniec listy
                            else
                            {
                                returnListOfQueues.Add(new Queue<byte[]>(tempBuffOutQueue));

                                //W sumie niepotrzebne
                                hasBeenCopied = false;
                            }
                        }
                    }



                    //Kopiowanie z podkolejek do kolejnych buforow wyjsciowych
                    //BuffersOut[i].queue = new Queue<byte[]>(listOfQueues[i]);

                    var tmp = new Queue<byte[]>(returnListOfQueues[i]);

                    //sortowanie kolejek wedlug ID
                    returnListOfQueues[i] = Buffer.sortQueueByID(ref tmp);

                    tmp = new Queue<byte[]>(returnListOfQueues[i]);

                    //Lista podkolejek o pakietach o tym samym ID
                    var listOfSameIDQueues = Buffer.divideSortedQueueByID(ref tmp);

                    //Kazda z tych podkolejek sortuje wedlug numeru pakietu
                    for (int j = 0; j < listOfSameIDQueues.Count; j++)
                    {
                        var temp = listOfSameIDQueues[j];
                        //Sortowanie po numerze pakietu
                        listOfSameIDQueues[j] = new Queue<byte[]>(Buffer.sortQueueByPackageNumber(ref temp));
                    }

                    //Sklejanie kolejek z powrotem
                    var joinedQueue = new Queue<byte[]>(Buffer.joinSortedByPackageNumberQueues(listOfSameIDQueues));

                    //TODO: Zmien to. Trzeba zajrzec w tablice komutacji i skierowac na odpowiedni bufor.
                    //BuffersOut[i].queue = joinedQueue;

                    //Rzad tablicy komutacji, ktory odpowiada czestotliwosci i numerowi portu 
                    /* var row = commutationTable.FindRow(Package.extractFrequency(joinedQueue.Peek()),
                         Package.extractPortNumber(joinedQueue.Peek()));*/

                    //short frequency_out = row.frequency_out;
                    //short port_out = row.port_out;


                    //Jesli pakiety maja -1 w czestotliwosciach
                    // if (Package.extractFrequency(joinedQueue.Peek()) == 1)
                    //  {
                    //TODO: To jest wpisane z palca na razie, ale potem trzeba bedzie zrobic tak:
                    //joinedQueue = new Queue<byte[]>( borderNodeCommutationTable.changeHeaderForMessagesFromClient(joinedQueue));
                    //   Package P = new Package(joinedQueue.Dequeue());
                    //  P.changeFrequency(-1);
                    //  P.changePort(3);
                    // joinedQueue.Enqueue(P.toBytes());
                    //  }

                    //Wpisanie naglowkow do kolejki z pakietami czestotliwosci i portu wyjsciowego. 
                    //Chmurka juz bedzie wiedziala, jak pokierowac pakiety z tej kolejki.
                    //joinedQueue = commutationTable.changeHeaderForMessagesFromClient(joinedQueue);

                    //Kopiowanie kolejki do listy zwracanej.
                    returnListOfQueues[i] = new Queue<byte[]>(joinedQueue);
                    //  }
                }

                //TIMER
                /*
                //Task, który służy wprowadzeniu opóźnienia między kolejnymi wysłanymi pakietami
                var delay = Task.Run(async () =>
               {
                   Stopwatch sw = Stopwatch.StartNew();
                   await Task.Delay(300);
                   sw.Stop();
                   return sw.ElapsedMilliseconds;
               });
               */
                //Po odczekaniu tego czasu wyprozniamy bufory.
                for (int i = 0; i < BuffersOut.Count; i++)
                {
                    //Kopiowanie zawartosci bufora do zwracanej listy (tworzenie nowego elementu tej listy)
                    returnListOfQueues.Add(new Queue<byte[]>(BuffersOut[i].queue));

                    //czyszczenie bufora
                    BuffersOut[i].queue.Clear();
                }

                return returnListOfQueues;
            }
            //Jak bufor wejsciowy nie jest przepelniony
            else
            {
                byte[] msg = new byte[64];
                msg = packageBytes;
                Package p = new Package(msg);


                BorderNodeCommutationTableRow borderRow = null;
                borderRow = borderNodeCommutationTable.Table.Find(rowe => (rowe.IP_IN.ToString() == p.IP_Source.ToString() && (rowe.port_in == p.portNumber) && (rowe.IP_Destination.ToString() == p.IP_Destination.ToString())));
                //dodanie do bufora pakietu
                if (borderRow != null)
                {
                    bufferIn.queue.Enqueue(packageBytes);
                }
                return null;
            }
        }
Beispiel #11
0
        public void fillingTable(string line)
        {
            //Znaki oddzielające poszczególne części żądania klienta.
            char[] delimiterChars = { '#' };
            //Podzielenie żądania na tablicę stringów.
            string[] words;


            words = line.Split(delimiterChars);
            switch (words[0])
            {
            case "ADD":
                switch (Int32.Parse(words[1]))
                {
                //Dodawanie wpisu do BorderComutationTable
                case 1:
                    BorderNodeCommutationTableRow newRow = new BorderNodeCommutationTableRow(
                        words[2], Convert.ToInt16(words[3]), Convert.ToInt16(words[4]), Convert.ToInt16(words[5]), Convert.ToInt16(words[6]),
                        Convert.ToInt16(words[7]), words[8], Convert.ToInt16(words[9]), Convert.ToInt16(words[10]));
                    borderNodeCommutationTable.Table.Add(newRow);
                    stateReceivedMessageFromNMS("BorderNodeCommutationTable", "ADD");
                    break;

                //Dodanie wpisu do EONTable
                case 2:
                    EONTableRowIN  eonIN  = new EONTableRowIN(Convert.ToInt16(words[2]), Convert.ToInt16(words[3]));
                    EONTableRowOut eonOut = new EONTableRowOut(Convert.ToInt16(words[4]), Convert.ToInt16(words[5]));
                    eonTable.addRow(eonIN);
                    eonTable.addRow(eonOut);
                    stateReceivedMessageFromNMS("EONTable", "ADD");
                    break;

                //Dodanie wpisu do CommutationTable
                case 3:
                    CommutationTableRow commuteRow = new CommutationTableRow(Convert.ToInt16(words[2]),
                                                                             Convert.ToInt16(words[3]), Convert.ToInt16(words[4]), Convert.ToInt16(words[5]));
                    commutationTable.Table.Add(commuteRow);
                    stateReceivedMessageFromNMS("CommutationTable", "ADD");
                    break;

                default:
                    break;
                }
                break;

            case "DELETE":
                switch (Int32.Parse(words[1]))
                {
                //Dodawanie wpisu do BorderComutationTable
                case 1:
                    BorderNodeCommutationTableRow newRow = new BorderNodeCommutationTableRow();
                    newRow = borderNodeCommutationTable.FindRow(words[2], Convert.ToInt16(words[3]), words[4]);
                    borderNodeCommutationTable.Table.Remove(newRow);
                    stateReceivedMessageFromNMS("BorderNodeCommutationTable", "DELETE");
                    break;

                //Dodanie wpisu do EONTable
                case 2:
                    EONTableRowIN  eonIN  = new EONTableRowIN(Convert.ToInt16(words[2]), Convert.ToInt16(words[3]));
                    EONTableRowOut eonOut = new EONTableRowOut(Convert.ToInt16(words[4]), Convert.ToInt16(words[5]));
                    eonTable.deleteRow(eonIN);
                    eonTable.deleteRow(eonOut);
                    stateReceivedMessageFromNMS("EONTable", "DELETE");
                    break;

                //Dodanie wpisu do CommutationTable
                case 3:
                    CommutationTableRow rowToDelete = new CommutationTableRow();
                    rowToDelete = commutationTable.FindRow(Convert.ToInt16(words[2]), Convert.ToInt16(words[3]));
                    commutationTable.Table.Remove(rowToDelete);
                    stateReceivedMessageFromNMS("CommutationTable", "DELETE");
                    break;

                default:
                    break;
                }
                break;

            default:
                break;
            }



            // Console.ReadKey();
        }