/// <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); }
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"); } } } }
/// <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(); } }