Beispiel #1
0
        private static void ProcessClient(Port port, TcpClient client)
        {
            Console.WriteLine("Processing port {0}.", port);
            var nb = new Neighbor(port, client);
            while (Global.RoutingTable == null) { Thread.Sleep(10); Console.WriteLine("Sleep"); }
            while (Global.Threads == null) { Thread.Sleep(10); Console.WriteLine("Sleep"); }
            while (Global.Neighbors == null) { Thread.Sleep(10); Console.WriteLine("Sleep"); }
            lock (Global.Neighbors) {
                if(Global.Neighbors.ContainsKey(port))
                    Global.Neighbors[port] = nb;
                else Global.Neighbors.Add(port, nb);
                Console.WriteLine("Neighbor added");
            }
            lock (Global.RoutingTable) {
                if (!Global.RoutingTable.ContainsKey(port))
                    Global.RoutingTable.Add(port, new Row() { NBu = port, Du = 1 });
                else {
                    Global.RoutingTable[port].NBu = port;
                    Global.RoutingTable[port].Du = 1;
                    Console.WriteLine("Routing Table row updated");
                }
                if(Global.RoutingTable[port].NDISu.ContainsKey(port))
                    Global.RoutingTable[port].NDISu[port] = 0;
                else
                    Global.RoutingTable[port].NDISu.Add(port, 0);
            }
            lock (Global.Threads) {
                var listenForMessages = new Thread(() => ListenTo(port, client));
                Global.Threads.Add(port, listenForMessages);
                listenForMessages.Start();
                Console.WriteLine("Listener added");
            }

            if (Global.Verbose)
                Console.WriteLine("Nieuwe verbinding met node {0}".Formatter(port));

            RoutingTable.AddDirty(port);
            RoutingTable.AddNewPort(port);
        }
Beispiel #2
0
        static void Main(string[] args)
        {
            #if DEBUG
            Console.WriteLine("Debugging mode");
            #endif
            if (args.Length == 0) {
                args = new string[] { "1002", "1001" };
            }
            int iterator = 0; // For easier handling of the args array, since we have two optional parameters but we always know when they can appear
            if (args[0][0] == 'p') {
                // Set console position
                int x = int.Parse(args[iterator++].Substring(1)), y = int.Parse(args[iterator++].Substring(1));
                SetWindowPos(MyConsole, 0, x, y, 0, 0, SWP_NOSIZE);
                Console.Title = "port = {0}, x = {1}, y = {2}".Formatter(args[iterator], x, y); // Port number
            } // In both cases, set the proper requested console title
            else {
                Console.Title = "port = {0}".Formatter(args[iterator]); // Port number
            }
            // Initialize routing table
            Global.LocalPort = Port.Parse(args[iterator]);
            var local = new Neighbor(Global.LocalPort, null);
            Global.RoutingTable.Add(Global.LocalPort, new Row() { NBu = Global.LocalPort, Du = 0 });
            // Start listener service first
            Thread listener = new Thread(() => ListenAt(Global.LocalPort));
            listener.Start();

            // Connect to other ports
            while (++iterator < args.Length) {
                Port port = Port.Parse(args[iterator]);
            #if DEBUG
                Console.WriteLine(port);
            #endif
                if (port > Global.LocalPort) ConnectTo(port);
            #if DEBUG
                else Console.WriteLine("Skipped");
            #endif
            }
            #if DEBUG
            Console.WriteLine("Connected to them all, time to broadcast");
            #endif
            // Input handling

            while (true) {
                var input = Console.ReadLine();
                if (input.StartsWith("S")) {
                    var prev = Global.Slowdown;
                    if(int.TryParse(input.Substring(2), out Global.Slowdown)) {
                        if (Global.Slowdown < 0) {
                            Global.Slowdown = prev;
                            Console.WriteLine(Global.Strings.ParameterError, "slowdown", "n", "a positive number");
                        }
                    }
                    Console.WriteLine(Global.Strings.ParameterError, "slowdown", "n", "a positive number");
                    continue;
                }
                if (input.StartsWith("R")) {
                    PrintRoutingTable();
                    continue;
                }
                if (input.StartsWith("M")) {
                    Console.WriteLine("Total number of distance estimates sent by this node: {0}".Formatter(Global.DistanceEstimates));
                    continue;
                }
                if (input.StartsWith("T")) {
                    input = input.Substring(2).Trim();
                    if (input.Equals("off", StringComparison.InvariantCultureIgnoreCase))
                        Global.Verbose = false;
                    else if (input.Equals("on", StringComparison.InvariantCultureIgnoreCase))
                        Global.Verbose = true;
                    else
                        Console.WriteLine(Global.Strings.ParameterError, "toggle", "state", "on or off");
                    continue;
                }
                if (input.StartsWith("D")) {
                    Port target;
                    if (Port.TryParse(input.Split(' ')[1], out target)) {
                        lock (Global.RoutingTable)
                            lock (Global.Neighbors)
                                if (Global.Neighbors.ContainsKey(target)) {
                                    Global.RoutingTable[target].SendMessage(Global.CreatePackage(Global.PackageNames.Disconnect, target, Global.LocalPort.ToString()));
                                    Disconnect(target);
                                }
                                else
                                    Console.WriteLine(Global.Strings.ParameterError, "delete", "port", "a valid port number that is connected to this node");
                    }
                    else
                        Console.WriteLine(Global.Strings.ParameterError, "delete", "port", "a valid port number");
                    continue;
                }
                if (input.StartsWith("C")) {
                    Port target;
                    if (Port.TryParse(input.Split(' ')[1], out target)) {
                        ConnectTo(target);
                    }
                    else
                        Console.WriteLine(Global.Strings.ParameterError, "connect", "port", "a valid port number");

                    continue;
                }
                if (input.StartsWith("B")) {
                    var split = input.Split(' ');
                    Port target;
                    if (split.Length > 2 && Port.TryParse(split[1], out target)) {
                        if (!IsInPartition(target) || target == Global.LocalPort) {
                            Console.WriteLine(Global.Strings.ParameterError, "broadcast", "port", "a valid port number that is connected to the current node");
                            continue;
                        }
                        var message = new StringBuilder(split[2]);
                        for (int i = 3; i < split.Length; i++)
                            message.AppendFormat(" {0}", split[i]);
                        var msg = Global.CreatePackage("Broadcast", target, message.ToString());
                        Port sendTo;
                        lock (Global.RoutingTable)
                            sendTo = Global.RoutingTable[target].NBu;
            #if DEBUG
                        Console.WriteLine("About to broadcast {0} to port {1} via port {2}", msg, target, sendTo);
            #endif
                        lock (Global.Neighbors)
                            Global.Neighbors[sendTo].SendMessage(msg);
            #if DEBUG
                        Console.WriteLine("Sent message to {0}", target);
            #endif
                        continue;
                    }
                    if (split.Length > 2)
                        Console.WriteLine(Global.Strings.ParameterError, "broadcast", "port", "a valid port number");
                    else
                        Console.WriteLine(Global.Strings.ParameterError, "broadcast", "message", "a valid message");
                    continue;
                }
                Console.WriteLine("You entered an invalid command. Please retry");
            }
        }