Example #1
0
 /// <summary>
 /// Esto es para darle una dirección Mac a la computadora
 /// El parámetro es un string hexadecimal de 4 dígitos
 /// </summary>
 /// <param name="dirMac"></param>
 public void PutMacDirection(string dirMac)
 {
     if (direccionMax == null && CheckMetods.CheckIsOkDirMac(dirMac))
     {
         this.direccionMax = dirMac;
     }
     else
     {
         throw new InvalidCastException($"No se pudo asignar la dirección Mac {dirMac} a la computadora {this.name}");
     }
 }
Example #2
0
        /// <summary>
        /// Este método ejecuta una instrucción en especifico y chequea
        /// que tenga la sintaxis correcta , ante cualquier error esta da una excepción
        /// identificando que pudo haber sucedido
        /// </summary>
        /// <param name="instruccion"></param>
        public static void EjecutarInstruccion(Instruccion instruccion)
        {
            string _instruccion = instruccion.instruccion;

            string [] instruccionpartida = _instruccion.Split(" ");

            if (instruccionpartida.Length < 1)
            {
                EnviromentActions.LanzarExepciondeCasteo(instruccion);
            }

            if (instruccionpartida[0][0] == '#')
            {
                return;
            }

            uint tiempodelainstruccion;

            if (!UInt32.TryParse(instruccionpartida[0], out tiempodelainstruccion))
            {
                throw new FormatException($"no tiene un formato válido '{instruccionpartida[0]}' para ser el tiempo de una instruccion ");
            }

            if (instruccionpartida.Length < 2)
            {
                EnviromentActions.LanzarExepciondeCasteo(instruccion);
            }

            TipodeInstruccion tipoinstruccion = AuxiliaryFunctions.GiveMeTheInstruction(instruccionpartida[1]);

            if (tipoinstruccion == TipodeInstruccion.create)
            {
                if (instruccionpartida.Length < 4)
                {
                    EnviromentActions.LanzarExepciondeCasteo(instruccion);
                }

                string name = instruccionpartida[3];

                uint cantidaddepuertos = 1;

                if (instruccionpartida[2] == "hub")
                {
                    if (instruccionpartida.Length < 5)
                    {
                        EnviromentActions.LanzarExepciondeCasteo(instruccion);
                    }

                    if (!UInt32.TryParse(instruccionpartida[4], out cantidaddepuertos))
                    {
                        throw new FormatException($"La cantidad de puertos '{instruccionpartida[4]}' de la instrucción no tiene un formato válido");
                    }

                    if (cantidaddepuertos < 4 || cantidaddepuertos > 8)
                    {
                        throw new IndexOutOfRangeException("la cantidad de puertos para un hub no son validos");
                    }

                    Hub hub = new Hub(name, (int)cantidaddepuertos, Program.dispositivos.Count);
                    Program.dispositivos.Add(hub);
                }
                else if (instruccionpartida[2] == "host")
                {
                    cantidaddepuertos = 1;

                    Computadora computadora = new Computadora(name, Program.dispositivos.Count);
                    Program.dispositivos.Add(computadora);
                }

                else if (instruccionpartida[2] == "switch")
                {
                    if (instruccionpartida.Length < 5)
                    {
                        EnviromentActions.LanzarExepciondeCasteo(instruccion);
                    }

                    if (!UInt32.TryParse(instruccionpartida[4], out cantidaddepuertos))
                    {
                        throw new FormatException($"La cantidad de puertos '{instruccionpartida[4]}' de la instrucción no tiene un formato válido");
                    }

                    if (cantidaddepuertos < Program.cantidadminimadepuertosdeunhub || cantidaddepuertos > Program.cantidadmaximadepuertosdeunhub)
                    {
                        throw new IndexOutOfRangeException("la cantidad de puertos para un hub no son validos");
                    }

                    Switch _switch = new Switch(name, (int)cantidaddepuertos, Program.dispositivos.Count);
                    Program.dispositivos.Add(_switch);
                }
            }

            else if (tipoinstruccion == TipodeInstruccion.connect)
            {
                if (instruccionpartida.Length < 4)
                {
                    EnviromentActions.LanzarExepciondeCasteo(instruccion);
                }

                string port1 = instruccionpartida[2];
                string port2 = instruccionpartida[3];

                Dispositivo disp1;
                Dispositivo disp2;

                disp1 = dispositivos.Where(disp => disp.Name.Contains(port1.Split('_').FirstOrDefault())).FirstOrDefault();

                if (disp1 == null)
                {
                    throw new KeyNotFoundException($"No hay ningún dispositivo cuyo nombre sea {port1.Split('_')}");
                }

                disp2 = dispositivos.Where(disp => disp.Name.Contains(port2.Split('_').FirstOrDefault())).FirstOrDefault();


                if (disp2 == null)
                {
                    throw new KeyNotFoundException($"No hay ningún dispositivo cuyo nombre sea {port2.Split('_')}");
                }

                int numeroport1 = int.Parse(port1.Split('_')[1]) - 1;
                int numeroport2 = int.Parse(port2.Split('_')[1]) - 1;



                Port p1 = disp1.DameElPuerto(numeroport1);
                Port p2 = disp2.DameElPuerto(numeroport2);

                Cable cable = new Cable();

                EnviromentActions.ConnectPortsByCable(cable,
                                                      puerto1: p1,
                                                      puerto2: p2);
            }

            else if (tipoinstruccion == TipodeInstruccion.send)
            {
                if (instruccionpartida.Length < 4)
                {
                    EnviromentActions.LanzarExepciondeCasteo(instruccion);
                }

                string host = instruccionpartida[2];
                string data = instruccionpartida[3];

                if (!CheckMetods.esBinariaLaCadena(data))
                {
                    throw new InvalidCastException($"La información '{data}' que se quiere enviar no tiene un formato correcto ");
                }

                var disp = from dispositivo in dispositivos
                           where dispositivo.Name == host.Split('_')[0]
                           select dispositivo;

                Dispositivo[] comp = disp.ToArray();
                if (comp.Length != 1)
                {
                    throw new Exception("no se encontró el dispositivo");
                }

                Computadora computadora = comp[0] as Computadora;

                List <Bit> paquetedebits = new List <Bit>();

                foreach (var item in data)
                {
                    paquetedebits.Add((Bit)int.Parse(item.ToString()));
                }

                computadora.send(paquetedebits);
            }

            else if (tipoinstruccion == TipodeInstruccion.disconnect)
            {
                if (instruccionpartida.Length < 4)
                {
                    EnviromentActions.LanzarExepciondeCasteo(instruccion);
                }

                string port1 = instruccionpartida[2];
                string port2 = instruccionpartida[3];

                Dispositivo dispositivo1 = dispositivos.Where(x => x.Name == instruccionpartida[2].Split('_')[0]).FirstOrDefault();
                Dispositivo dispositivo2 = dispositivos.Where(x => x.Name == instruccionpartida[3].Split('_')[0]).FirstOrDefault();

                if (dispositivo1 == null)
                {
                    throw new InvalidCastException($"El puerto {port1} al que se esta tratando de acceder no existe ");
                }

                if (dispositivo2 == null)
                {
                    throw new InvalidCastException($"El puerto {port2} al que se esta tratando de acceder no existe ");
                }

                int numeropuerto1 = int.Parse(port1.Split('_')[1]) - 1;
                int numeropuerto2 = int.Parse(port2.Split('_')[1]) - 1;

                Port p1 = dispositivo1.DameElPuerto(numeropuerto1);
                Port p2 = dispositivo2.DameElPuerto(numeropuerto2);

                p1.Cable = null;
                p2.Cable = null;
            }

            else if (tipoinstruccion == TipodeInstruccion.mac)
            {
                if (instruccionpartida.Length < 4)
                {
                    throw new InvalidCastException($"La instruccion mac '{_instruccion}' no tiene un formato valido");
                }

                Dispositivo disp = dispositivos.Where(x => x.Name == instruccionpartida[2]).FirstOrDefault();

                Computadora comp = null;

                if (disp is Computadora)
                {
                    comp = disp as Computadora;
                }

                if (comp is null)
                {
                    throw new NullReferenceException($"No se puede encontrar el Host '{instruccionpartida[2]}' en los dispositivos actuales");
                }

                string dirMac = instruccionpartida[3];

                if (!CheckMetods.CheckIsOkDirMac(dirMac))
                {
                    throw new InvalidCastException($"La instruccion Mac '{dirMac}' no tiene la sintaxis correcta ");
                }

                comp.PutMacDirection(dirMac);
            }

            else if (tipoinstruccion == TipodeInstruccion.send_frame)
            {
                if (instruccionpartida.Length < 5)
                {
                    throw new InvalidCastException($"La instruccion mac '{_instruccion}' no tiene un formato valido");
                }


                Dispositivo disp = dispositivos.Where(x => x.Name == instruccionpartida[2]).FirstOrDefault();

                Computadora comp = null;

                if (disp is Computadora)
                {
                    comp = disp as Computadora;
                }

                if (comp is null)
                {
                    throw new NullReferenceException($"No se puede encontrar el Host '{instruccionpartida[2]}' en los dispositivos actuales");
                }

                string dirMacToSend = instruccionpartida[3];
                string dataToSend   = instruccionpartida[4];

                if (!CheckMetods.CheckIsOkDirMac(dirMacToSend))
                {
                    throw new InvalidCastException($"La instruccion send_frame '{dirMacToSend}' no tiene la sintaxis correcta ");
                }

                if (!CheckMetods.CheckStrContainOnlyHexadecimalCharacters(dataToSend))
                {
                    throw new InvalidCastException($"La instruccion send_frame '{dataToSend}' no contiene los datos a enviar en formato hexadecimal");
                }

                comp.send_frame(dirMacToSend, dataToSend);
            }
        }
Example #3
0
        /// <summary>
        /// esto es para leer del fichero config.txt que se
        /// encuentra en este mismo directorio en que esta este proyecto
        /// este pone todos los parametros establecido que se encuentran en
        /// el fichero
        /// </summary>
        public static void Configurar()
        {
            var CurrentDirectory = Environment.CurrentDirectory;
            var parent           = Directory.GetParent(Directory.GetParent(Directory.GetParent(CurrentDirectory).FullName).FullName);

            string rutaCompleta = Path.Join(parent.FullName, "config.txt");

            if (!File.Exists(rutaCompleta))
            {
                PonerConfiguracionPorDefecto();
                Console.WriteLine($"Advertencia: El fichero 'config.txt' no existe\n las configuraciones que se van a poner son las que hay por defecto");
                return;
            }

            var variable = File.ReadLines(rutaCompleta);


            foreach (var item in variable)
            {
                if (item.Length < 1)
                {
                    continue;
                }

                string[] configuracionpartida = item.Split(':');

                if (configuracionpartida.Length < 2)
                {
                    throw new InvalidCastException($"la configuración {item} no tiene el formato correcto");
                }

                switch (configuracionpartida[0])
                {
                case "max_cantidad_milisegundos":
                    UInt32 _tiempo_maximo;
                    if (UInt32.TryParse(configuracionpartida[1], out _tiempo_maximo))
                    {
                        Program.tiempo_maximo = _tiempo_maximo;
                    }
                    else
                    {
                        throw new InvalidCastException($"el numero para asignarle al tiempo_maximo: '{configuracionpartida[1]} no es valido '");
                    }
                    break;

                case "signal_time":
                    int _signal_time;
                    if (Int32.TryParse(configuracionpartida[1], out _signal_time))
                    {
                        Program.signal_time = (uint)_signal_time;
                    }
                    else
                    {
                        throw new InvalidCastException($"el numero para asignarle el _signal_time '{configuracionpartida[1]}' no tiene el formato correcto");
                    }
                    break;

                case "numero_puertos_hub":
                    string[] extremosdelintervalo = configuracionpartida[1].Split('-');

                    if (extremosdelintervalo.Length < 2)
                    {
                        throw new InvalidCastException($"No tiene el formato correcto los intervalos '{extremosdelintervalo}'");
                    }

                    int min, max;

                    if (!int.TryParse(extremosdelintervalo[0], out min))
                    {
                        throw new InvalidCastException($"El extremo {extremosdelintervalo[0]} no es un numero valido ");
                    }
                    if (!int.TryParse(extremosdelintervalo[1], out max))
                    {
                        throw new InvalidCastException($"El extremo {extremosdelintervalo[1]} no es un numero valido ");
                    }

                    if (CheckMetods.sonvalidoslacantidaddepuertosdeunhub(min, max))
                    {
                        Program.cantidadminimadepuertosdeunhub = min;
                        Program.cantidadmaximadepuertosdeunhub = max;
                    }
                    break;
                }
            }
        }