public static void RunAplication() { dispositivos = new List <Dispositivo>(); //Esto limpia el directorio de la salida (es decir borra todos los ficheros que hay //en el directorio '/output') para que en la ejecución no se vayan a sobre escribir //sobre ficheros ya existentes EnviromentActions.LimpiarDirectoriodeSalida(); //Esta es para cargar todos las instrucciones que hay en el fichero 'script.txt' //para almacenarlos en memoria , todas las instrucciones que hay en el fichero quedan //almacenadas en instrucciones , ordenadas por el tiempo de ejecución de la instrucción //de forma ascendente, para que una vez hallan sido ejecutadas salgan de la cola. EnviromentActions.CargarInstrucciones(); //Este métodos es para configurar todo el entorno del programa ,como signal_time , cantidad //máxima de mili-segundos que debe correr el programa , etc EnviromentActions.Configurar(); //Este es el ciclo principal para correr las instrucciones y hacer el envió de //información entre todos los host que están conectados. while (current_time < tiempo_maximo) { //Console.WriteLine($"CURRENT TIME : {Program.current_time} mili-second"); //Ejecutar las instrucciones que corresponden a ejecutarse en el //mili-segundo actual que están en la cola de instrucciones foreach (var item in ProximasInstruccionesEjecutar(current_time)) { EjecutarInstruccion(item); } //Actualizar el bit que hay en la salida de cada uno //de los puertos de todos los dispositivos que existen foreach (var item in dispositivos) { item.UpdateSendingBit(); } //Actualizar la entrada y procesar la informacion por cada //uno de los puertos de cada uno de los dispositivos que existen foreach (var item in dispositivos) { item.updateDataReceived(); } //Aumentar el tiempo global en 1 current_time = current_time + 1; } foreach (var item in dispositivos) { item.WriteDataInFile(); } }
/// <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); } }