Example #1
0
        //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);
        }
Example #2
0
        //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");
                }
            }
        }
Example #3
0
 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;
 }
Example #4
0
 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;
 }
Example #5
0
 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;
 }
Example #6
0
 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);
     }
 }
Example #7
0
        private static Verbindung DefineNode(IPAddress addr, int port, int num)
        {
            Verbindung verb = new Verbindung
            {
                Addr   = addr.ToString(),
                Port   = port,
                NodeNr = num
            };

            return(verb);
        }
Example #8
0
 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;
 }
Example #9
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();
            }
        }
Example #10
0
        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();
            }
        }
Example #11
0
        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();
            }
        }
Example #12
0
 private static void ChangeCon(ref Message msg, Verbindung verb)
 {
     msg.verbindung = verb;
 }
Example #13
0
 private static void UpdateStatus(ref Status st, bool inf, Verbindung upwardNode)
 {
     st.Informed    = inf;
     st.Upward_Node = upwardNode;
 }
Example #14
0
        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;
                    }
                }
            }
        }