Пример #1
0
        /// <summary>
        /// zapis sciezki do pliku
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="path"></param>
        public static void SavePathToFile(int start, int end, Path path)
        {
            XMLeon xml = new XMLeon("path" + start.ToString() + end.ToString() + ".xml", XMLeon.Type.nodes);

            path.xmlName = ("path" + start + end + ".xml");
            xml.CreatePathXML(path);
        }
Пример #2
0
        public static void ReserveRequest(int startSlot, int neededSlots)
        {
            int[] data = { startSlot, neededSlots };
            //  data = GetStartAndAmountOfSlots(message);
            SwitchingActions.pathToCount.ReserveWindow(data[1], data[0]);
            XMLeon xml = new XMLeon("path" + messageData[0] + messageData[1] + SwitchingActions.pathToCount.globalID + ".xml", XMLeon.Type.nodes);

            //  XMLeon xml = new XMLeon("path" + messageData[0] + messageData[1] + ".xml");
            SwitchingActions.pathToCount.xmlName = ("path" + messageData[0] + messageData[1] + SwitchingActions.pathToCount.globalID + ".xml");
            xml.CreatePathXML(SwitchingActions.pathToCount);

            if (Program.isTheBottonSub == true)
            {
                /* foreach (Manager nod in Program.managerNodes)
                 * {
                 *   Console.WriteLine(nod.number);
                 * }*/
                foreach (Node node in SwitchingActions.pathToCount.nodes)
                {
                    string message1 = xml.StringNode(node.number);
                    Console.WriteLine(message1);
                    try
                    {
                        Console.WriteLine(" Wezel: " + node.number);
                        Program.managerNodes.Find(x => x.number == node.number).Send(message1);
                    }
                    catch
                    {
                        Console.Write(DateTime.Now.ToString("HH:mm:ss") + " : ");
                        Console.WriteLine("Nie udało się wysłać ścieżki do węzła");
                    }
                }
            }
        }
Пример #3
0
        /// <summary>
        /// przelaczanie tego co ma zrobic manager
        /// w zaleznosci co do niego doszlo
        /// </summary>
        /// <param name="message"></param>
        /// <param name="manager"></param>
        internal static void Action(string message, Manager manager)
        {
            //jezeli ma zostac polaczenie w podsieci czyl
            if (message.Contains("subconection"))
            {
                Console.Write(DateTime.Now.ToString("HH:mm:ss") + " : ");
                Console.WriteLine("Prośba o zestawienie połączenia w podsieci");
            }
            //ta wiadomosc moze przyjsc tylko do glownego managera
            //poniewaz do tych mniejszych zakladamy ze nie moga byc podlaczeni klijenci
            else if (message.Contains("connection:"))
            {
                //zerujemy licznik
                messageCounterPossibleWindow      = 0;
                messageCounterPossibleReservation = 0;

                //data[0] = askingClient;
                //data[1] = targetClient;
                data = GetStartAndEndNode(message);

                lock (Program.nodes)
                {
                    lock (Program.links)
                    {
                        pathToCount = PathAlgorithm.dijkstra(Program.nodes, Program.links, data[0] + 80, data[1] + 80, false);
                    }
                }
                SendToSubnetworks(pathToCount);
            }
            //klijent prosi o usuniecie podsieci
            else if (message.Contains("delete"))
            {
                data = GetStartAndEndNode(message);
                string pathId = (data[0] + 80).ToString() + (data[1] + 80).ToString();
                pathToCount = Program.paths.Find(x => x.id == pathId);
                SendSubToDeleteConnection(pathToCount);
                pathToCount.ResetSlotReservation();
                lock (Program.paths)
                {
                    Program.paths.Remove(pathToCount);
                }
            }
            //gdy dostaje z podesieci wiadomosc jak dluga jest droga w podsieci
            //info jest potrzebne do wyliczenia ile slotow potrzebujemy
            else if (message.Contains("lenght"))
            {
                int lenght = GetLenght(message);
                pathToCount.lenght += lenght;
            }
            else if (message.Contains("possible_window"))
            {
                pathToCount.ChangeWindow(possibleWindow);
                messageCounterPossibleWindow++;

                //jezeli jest to najwyza sciezka i doszly juz wszystkie wiadomosci
                //minus 2 jest, bo na samej gorze sa jeszcze klijenci ich nie uwzgledniamy
                if (Program.isTheTopSub && messageCounterPossibleWindow == pathToCount.nodes.Count - 2)
                {
                    amountOfSlots = PathAlgorithm.AmountNeededSlots(pathToCount.lenght);
                    //returnWindow= new int[2] {startSlot,maxWindow };
                    window = pathToCount.FindMaxWindow();

                    bool isReservationPossible = pathToCount.IsReservingWindowPossible(amountOfSlots, window[0]);

                    if (isReservationPossible)
                    {
                        SendAskIfReservationIsPossible(window[0], amountOfSlots);
                    }
                    //to trzeba zrobic jakies inne polecania na zestawianie sciezko na okolo
                    else
                    {
                        //znaczy to ze w tym miejscu sie nie udalo zrobic rekonfiguracji
                        reconfigured = true;
                        Console.Write(DateTime.Now.ToString("HH:mm:ss") + " : ");
                        Console.WriteLine("Nie można zestawić ścieżki");
                    }
                }
            }

            else if (message.Contains("possible_path"))
            {
                messageCounterPossibleReservation++;
                //jezeli jest na samym szczycie by wyslal nizej zadnia
                //minus dwa bo nie uwzgledniamu klientow
                //jezeli licznik wybil ze u wszystkich mozliwa jest rezerwacja okna to rozsylane jest prosba, by zarezerwowali to okno
                if (messageCounterPossibleReservation == pathToCount.nodes.Count - 2 && Program.isTheTopSub == true)
                {
                    pathToCount.ReserveWindow(amountOfSlots, window[0]);

                    SendSubToReserveWindow(window[0], amountOfSlots);
                    //data[1] target client
                    if (reconfigured == true)
                    {
                        SendClientsToReserveWindow(window[0], data[1]);
                    }

                    XMLeon xml = new XMLeon("path" + data[0] + data[1] + ".xml", XMLeon.Type.nodes);
                    pathToCount.xmlName = "path" + data[0] + data[1] + ".xml";
                    xml.CreatePathXML(pathToCount);

                    //dodawania sciezki do listy sciezek
                    lock (Program.paths)
                    {
                        Program.paths.Add(pathToCount);
                    }

                    //jak jest przypadek z rekonfiguracja, gdy sie uda
                    if (reconfigured == false)
                    {
                        reconfigured = true;
                        //zmniejszanie liczby sciezek jakie pozostaly jeszcze do zrekonfigurowania
                        toReconfigure--;
                        //rozeslanie informacji do klijenta wysylajacego o zmianie sciezki
                        var targetClient = SwitchingActions.pathToCount.nodes.First().number - 80;
                        var message1     = "replace:<start_slot>" + SwitchingActions.pathToCount.startSlot + "</start_slot><target_client>" + targetClient + "</target_client>";

                        try
                        {
                            Program.managerClient[SwitchingActions.pathToCount.nodes.Last().number - 80 - 1].Send(message1);
                        }
                        catch (Exception ex)
                        {
                            Console.Write(DateTime.Now.ToString("HH:mm:ss") + " : ");
                            Console.WriteLine("Nie udało się wysłać ścieżki do klienta, ex: " + ex.ToString());
                        }
                    }

                    Console.Write(DateTime.Now.ToString("HH:mm:ss") + " : ");
                    Console.WriteLine("Zestawianie ścieżki się powiodło");
                }
            }
            //jezeli zepsula sie podsiec, by naprawic to na wyzszym poziomie

            else if (message.Contains("error"))
            {
                Console.WriteLine("Do naprawy: " + toReconfigure);
                Thread.Sleep(3000 * toReconfigure);
                toReconfigure++;


                //tu jest maly cheat- taki ze numery podsieci sa takie same jak ich managerow
                //by nie parsowac ich wiadomosci ze wzgledu na numer
                //TODO zrobic ze podsiec wysyla tylko te scezki ktorych nie moze naprawic
                int deadSub = manager.number;
                Console.Write(DateTime.Now.ToString("HH:mm:ss") + " : ");
                Console.WriteLine("Zepsuła się podsieć: " + manager.number);

                //ustawienie ze jak nie mozna w niej usunac sciezki to sie ustawia ze jest ona martwa, by algorytm dijxtry do niej
                //nie wchodzil
                Program.nodes.Find(x => x.number == deadSub).isAlive = false;

                string errorPathId = GetIdOfErrorPath(message);



                var path = Program.paths.Find(x => x.globalID == errorPathId);

                path.ResetSlotReservation();
                SendSubToDeleteConnection(path);



                //a tu zestawiamy od nowa
                //musza byc dwie petle, bo robimy sycnhronicznie zestawianie
                lock (Program.nodes)
                {
                    lock (Program.links)
                    {
                        SwitchingActions.pathToCount = PathAlgorithm.dijkstra(Program.nodes, Program.links, path.nodes.Last().number, path.nodes.First().number, false);
                    }

                    try
                    {
                        lock (Program.paths)
                        {
                            Program.paths.Remove(Program.paths.Find(x => x.globalID == errorPathId));
                        }
                    }
                    catch
                    {
                    }
                    if (SwitchingActions.pathToCount.endToEnd == false)
                    {
                        //jak nie udalo sie zrekonfigurwac zmniejszamy licznik
                        toReconfigure--;

                        Console.Write(DateTime.Now.ToString("HH:mm:ss") + " : ");
                        Console.WriteLine("Naprawa ścieżki jest niemożliwa");
                    }
                    else
                    {
                        //zerujemy licznik
                        messageCounterPossibleWindow      = 0;
                        messageCounterPossibleReservation = 0;

                        reconfigured = false;
                        SendToSubnetworks(SwitchingActions.pathToCount);

                        //TODO potem do wodotryskow, ze jak sie jedna sciezka zepsuje to nie wylacza podsieci forever

                        /*
                         * while(reconfigured==false)
                         * {
                         *  Thread.Sleep(100);
                         * }
                         * Program.nodes.Find(x => x.number == deadSub).isAlive = true;*/
                    }
                }
            }
            //jezeli nie mozliwe jest zestawienie polaczenia w podsieci
            //TODO jak zestawienie polaczenia nie jest mozliwe przez jakas podscie to by poszlo inaczej
            else if (message.Contains("connection_impossible"))
            {
                //jak nie mozna w jakiejs podsieci zestawic to wtedy pomijamy to polaczenie
                //TODO zrobic ze jak nies niemozliwe to by szukac innego rozwiazania
                if (reconfigured == false)
                {
                    reconfigured = true;
                }
                Console.WriteLine();
            }
        }