//Funktion die den Logger Informiert private static void InformLogger(Verbindung myCon, Verbindung otherCon, Message msg, UdpClient udpServer) { String output = JsonConvert.SerializeObject(msg); Byte[] sendByte = Encoding.ASCII.GetBytes(output); SendData(udpServer, new IPEndPoint(GetLocalIP(), 5000), sendByte); }
//Thread der Konsolen eingaben abfängt private static void SendThread(UdpClient server, Verbindung mycon, List <Verbindung> netw, ref Status st) { bool exit = true; while (exit) { string input = Console.ReadLine(); if (input == "!Start") { Console.WriteLine("Algo wird gestartet"); st.Informed = true; st.Initiator = true; StartAlgo(server, mycon, netw, ref st); } else if (input == "!Exit") { exit = false; Console.WriteLine("Thread Send wird beendet"); } else { Console.WriteLine("keine Korrekte Eingabe"); } } }
public Message(Verbindung my_verbindung, Verbindung to_verbindung, MsgCommand command, int sum) { this.my_verbindung = my_verbindung; this.to_verbindung = to_verbindung; this.command = command; this.sum = sum; }
public Status(int AnzahlNachbarn, int Speicher, Verbindung upward_Node = null, bool informed = false) { this.AnzahlNachbarn = AnzahlNachbarn; this.Speicher = Speicher; this.Upward_Node = upward_Node; this.Informed = informed; this.Initiator = false; }
public Message(Verbindung verbindung, MsgCommand command, int sum, int neightInformed = 0, string payload = " ") { this.verbindung = verbindung; this.command = command; this.sum = sum; this.payload = payload; this.neightInformed = neightInformed; }
private static void SendNeighbor(UdpClient udpServer, Verbindung verb, List <Verbindung> network) { for (int i = nodes[verb.NodeNr - 1].Length; i > 0; i--) { Verbindung temp = network.Find(r => r.NodeNr == nodes[verb.NodeNr - 1][i - 1]); string output = JsonConvert.SerializeObject(temp); Byte[] sendByte = Encoding.ASCII.GetBytes(output); SendData(udpServer, new IPEndPoint(IPAddress.Parse(verb.Addr), verb.Port), sendByte); } }
private static Verbindung DefineNode(IPAddress addr, int port, int num) { Verbindung verb = new Verbindung { Addr = addr.ToString(), Port = port, NodeNr = num }; return(verb); }
public Status(int AnzahlNachbarn, int Speicher, Verbindung upward_Node = null, bool informed = false, int countinformed = 0) { this.AnzahlNachbarn = AnzahlNachbarn; this.Speicher = Speicher; this.Upward_Node = upward_Node; this.Informed = informed; this.Initiator = false; this.CountInformed = countinformed; this.GesamtSpeicher = this.Speicher; this.Informed_Nachbarn = 0; }
private static void StartAlgo(UdpClient server, Verbindung myCon, List <Verbindung> netw, ref Status myStatus) { myStatus.Initiator = true; Message msg = new Message(myCon, Message.MsgCommand.INFO, 0); string output = JsonConvert.SerializeObject(msg); Byte[] sendByte = Encoding.ASCII.GetBytes(output); foreach (Verbindung element in netw) { SendData(server, new IPEndPoint(IPAddress.Parse(element.Addr), element.Port), sendByte); //Console.ReadKey(); } }
static void Main(string[] args) { List <Verbindung> network = new List <Verbindung>(); Verbindung myCon = new Verbindung(); if (args.Length == 0) { UdpClient udpServer = new UdpClient(5000); //Port ist 5000 myCon = DefineNode(GetLocalIP(), 5000, 0); //Console.ReadKey(); for (int i = 1; i < 13; i++) { int port = 5000 + i; Process.Start("NetzwerkClient.exe", port.ToString() + " " + i.ToString()); } bool exitintern = true; while (exitintern) { Byte[] data = ReceiveData(udpServer, 5000); string returnData = Encoding.ASCII.GetString(data); Console.WriteLine(returnData); Verbindung refNode = JsonConvert.DeserializeObject <Verbindung>(returnData); network.Add(refNode); if (network.Count == 12) { for (int i = 0; i < 12; i++) { Verbindung temp = network.Find(r => r.NodeNr == (i + 1)); SendNeighbor(udpServer, temp, network); } Console.WriteLine("Das Netzwerk wurde erstellt und ist jetzt online"); } } } else { //Console.ReadKey(); UdpClient udpServer = new UdpClient(int.Parse(args[0])); myCon = DefineNode(GetLocalIP(), int.Parse(args[0]), int.Parse(args[1])); string output = JsonConvert.SerializeObject(myCon); Byte[] sendByte = Encoding.ASCII.GetBytes(output); IPEndPoint ipEndPoint = new IPEndPoint(GetLocalIP(), 5000); //udpServer.Send(sendByte, sendByte.Length, ipEndPoint); SendData(udpServer, ipEndPoint, sendByte); Console.WriteLine(myCon.NodeNr.ToString() + " Knoten ist online!"); //receive Modus while (network.Count != nodes[int.Parse(args[1]) - 1].Length) { //var groupEP = new IPEndPoint(IPAddress.Any, int.Parse(args[0])); Byte[] data = ReceiveData(udpServer, int.Parse(args[0])); string returnData = Encoding.ASCII.GetString(data); Console.WriteLine(returnData); Verbindung refNode = JsonConvert.DeserializeObject <Verbindung>(returnData); network.Add(refNode); } Console.WriteLine(myCon.NodeNr.ToString() + " hat alle Kanten empfange und ist bereit"); // <= ab hier sind die knoten bereit für den verteilten Algorithmus Status myStatus = new Status(network.Count, int.Parse(args[1])); Thread myReceiveThread = new Thread(() => ReceiveThread(udpServer, myCon, network, ref myStatus)); myReceiveThread.IsBackground = true; myReceiveThread.Start(); while (exit) { string input = Console.ReadLine(); if (input == "!Start") { StartAlgo(udpServer, myCon, network, ref myStatus); exit = false; } } Console.ReadKey(); } }
private static void ReceiveThread(UdpClient server, Verbindung my, List <Verbindung> net, ref Status st) { //bool exit = true; while (exit) { Byte[] data = ReceiveData(server, my.Port); //Nachricht empfangen //Console.WriteLine("Habe eine nachricht empfangen"); //Console.ReadKey(); string returnData = Encoding.ASCII.GetString(data); Console.WriteLine(returnData); Message msg = JsonConvert.DeserializeObject <Message>(returnData); switch (msg.command) { case Message.MsgCommand.EXIT: break; case Message.MsgCommand.MSG: break; case Message.MsgCommand.INFO: st.CountInformed++; if (st.Informed == false) { st.online = true; st.Informed = true; st.Upward_Node = msg.verbindung; int inc = msg.neightInformed + 1; foreach (Verbindung element in net) { msg = new Message(my, Message.MsgCommand.INFO, 0, inc); string output = JsonConvert.SerializeObject(msg); Byte[] sendByte = Encoding.ASCII.GetBytes(output); Console.WriteLine("Send Info an: " + element.Port.ToString()); SendData(server, new IPEndPoint(IPAddress.Parse(element.Addr), element.Port), sendByte); } } if (st.AnzahlNachbarn == st.CountInformed && st.online == true) { if (st.Initiator == true) { st.Speicher += msg.sum; Console.WriteLine(st.Speicher.ToString()); exit = false; Console.WriteLine("Echo erhalten Thread ist hiermit beendet"); } else { msg = new Message(my, Message.MsgCommand.ECHO, msg.sum + st.Speicher, msg.neightInformed); string output = JsonConvert.SerializeObject(msg); Byte[] sendByte = Encoding.ASCII.GetBytes(output); Console.WriteLine("Send Echo Initiator: " + st.Initiator.ToString()); Console.WriteLine("Send Echo to: " + msg.verbindung.Port.ToString()); SendData(server, new IPEndPoint(IPAddress.Parse(st.Upward_Node.Addr), st.Upward_Node.Port), sendByte); } } break; case Message.MsgCommand.ECHO: if (st.online) { st.Speicher += msg.sum; msg = new Message(my, Message.MsgCommand.ECHO, msg.sum + st.Speicher, msg.neightInformed); Console.WriteLine("receive Echo von: " + msg.verbindung.Port.ToString()); } st.online = false; break; default: break; } //Console.ReadKey(); } }
private static void ChangeCon(ref Message msg, Verbindung verb) { msg.verbindung = verb; }
private static void UpdateStatus(ref Status st, bool inf, Verbindung upwardNode) { st.Informed = inf; st.Upward_Node = upwardNode; }
static void Main(string[] args) { List <Verbindung> network = new List <Verbindung>(); Verbindung myCon = new Verbindung(); if (args.Length == 0) { UdpClient udpServer = new UdpClient(5000); //Port ist 5000 für Main Prozess der andere Prozesse startet myCon = DefineNode(GetLocalIP(), 5000, 0); for (int i = 1; i < 11; i++) { int port = 5000 + i; Process.Start("NetzwerkClient.exe", port.ToString() + " " + i.ToString()); } bool exitintern = true; bool exit = false; bool check = true; while (exitintern) { if (check == true) { Byte[] data = ReceiveData(udpServer, 5000); string returnData = Encoding.ASCII.GetString(data); Console.WriteLine(returnData); Verbindung refNode = JsonConvert.DeserializeObject <Verbindung>(returnData); network.Add(refNode); if (network.Count == 10) { for (int i = 0; i < 10; i++) { Verbindung temp = network.Find(r => r.NodeNr == (i + 1)); SendNeighbor(udpServer, temp, network); } Console.WriteLine("Das Netzwerk wurde erstellt und ist jetzt online\n"); Console.WriteLine("Ich bin jetzt im LoggerModus:"); check = false; } } else { Byte[] data = ReceiveData(udpServer, 5000); string returnData = Encoding.ASCII.GetString(data); Message msg = JsonConvert.DeserializeObject <Message>(returnData); //INFO oder ECHO Nachrichten formartiert geben if (msg.command == Message.MsgCommand.INFO) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Start:\tIP: " + msg.my_verbindung.Addr.ToString() + "\tPort: " + msg.my_verbindung.Port.ToString() + "\tZiel:\tIP: " + msg.to_verbindung.Addr.ToString() + "\tPort: " + msg.to_verbindung.Port.ToString() + "\tNachrichtentyp: " + msg.command.ToString() ); } if (msg.command == Message.MsgCommand.ECHO) { Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine("Start:\tIP: " + msg.my_verbindung.Addr.ToString() + "\tPort: " + msg.my_verbindung.Port.ToString() + "\tZiel:\tIP: " + msg.to_verbindung.Addr.ToString() + "\tPort: " + msg.to_verbindung.Port.ToString() + "\tNachrichtentyp: " + msg.command.ToString() + "\tAktuelle Zwischensumme: " + msg.sum.ToString() ); } //Result formatiert ausgeben if (msg.command == Message.MsgCommand.RESULT) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Ergebnis des EchoAlgorithmus: " + msg.sum.ToString()); exit = true; } while (exit) { Console.WriteLine("Wollen sie das Netzwerkzurücksetzen oder Beenden?(r/b)"); String input = Console.ReadLine(); if (input == "r" || input == "b") { if (input == "r") { ResetNetzwerk(udpServer, network); Console.WriteLine("Netzwerk wurde Resettet"); } else { ExitNetzwerk(udpServer, network); exitintern = false; } exit = false; } } } } } else { UdpClient udpServer = new UdpClient(int.Parse(args[0])); myCon = DefineNode(GetLocalIP(), int.Parse(args[0]), int.Parse(args[1])); string output = JsonConvert.SerializeObject(myCon); Byte[] sendByte = Encoding.ASCII.GetBytes(output); IPEndPoint ipEndPoint = new IPEndPoint(GetLocalIP(), 5000); SendData(udpServer, ipEndPoint, sendByte); Console.WriteLine(myCon.NodeNr.ToString() + " Knoten ist online!"); //receive Modus um nodes zu empfangen while (network.Count != nodes[int.Parse(args[1]) - 1].Length) { Byte[] data = ReceiveData(udpServer, int.Parse(args[0])); string returnData = Encoding.ASCII.GetString(data); Console.WriteLine(returnData); Verbindung refNode = JsonConvert.DeserializeObject <Verbindung>(returnData); network.Add(refNode); } Console.WriteLine(myCon.NodeNr.ToString() + " hat alle Kanten empfange und ist bereit\n"); // <= ab hier sind die knoten bereit für den verteilten Algorithmus Status st = new Status(network.Count, int.Parse(args[1])); //Thread notwending um Benutzer eingaben abzufangen alternativ wäre ein Eventhandler Thread mySendThread = new Thread(() => SendThread(udpServer, myCon, network, ref st)); mySendThread.IsBackground = true; mySendThread.Start(); bool exit = true; //Echo Algorithmus while (exit) { Random waitTime = new Random(); int seconds = waitTime.Next(1, 1000); System.Threading.Thread.Sleep(seconds); Byte[] data = ReceiveData(udpServer, myCon.Port); string returnData = Encoding.ASCII.GetString(data); Message msg = JsonConvert.DeserializeObject <Message>(returnData); Console.WriteLine(msg.command.ToString() + " von " + msg.my_verbindung.Port.ToString() + " count " + st.Informed_Nachbarn.ToString()); //InformLogger(msg.my_verbindung, msg.to_verbindung, msg, udpServer); st.Informed_Nachbarn += 1; if (msg.command == Message.MsgCommand.INFO) { if (st.Informed == false) { st.Informed = true; st.Upward_Node = msg.my_verbindung; foreach (Verbindung verb in network) { if (verb.Port != st.Upward_Node.Port) { msg = new Message(myCon, verb, Message.MsgCommand.INFO, 0); output = JsonConvert.SerializeObject(msg); sendByte = Encoding.ASCII.GetBytes(output); SendData(udpServer, new IPEndPoint(IPAddress.Parse(verb.Addr), verb.Port), sendByte); InformLogger(msg.my_verbindung, msg.to_verbindung, msg, udpServer); } } } } if (msg.command == Message.MsgCommand.ECHO) { st.GesamtSpeicher += msg.sum; } if (st.Informed_Nachbarn == st.AnzahlNachbarn) { if (st.Initiator == false) { msg = new Message(myCon, st.Upward_Node, Message.MsgCommand.ECHO, st.GesamtSpeicher); output = JsonConvert.SerializeObject(msg); sendByte = Encoding.ASCII.GetBytes(output); SendData(udpServer, new IPEndPoint(IPAddress.Parse(st.Upward_Node.Addr), st.Upward_Node.Port), sendByte); InformLogger(msg.my_verbindung, msg.to_verbindung, msg, udpServer); } else { msg = new Message(myCon, st.Upward_Node, Message.MsgCommand.RESULT, st.GesamtSpeicher); InformLogger(msg.my_verbindung, msg.to_verbindung, msg, udpServer); } } if (msg.command == Message.MsgCommand.RESET) { st.resetStatus(); Console.WriteLine("Node wurde Resettet"); } if (msg.command == Message.MsgCommand.EXIT) { mySendThread.Abort(); exit = false; } } } }