static void Main(string[] args) { Debug.Listeners.Add(new ConsoleTraceListener()); int numeroDeEsclavos; int cantidadDeNumeros; if (ProgramHelper.ParsearParametrosMaestro(args, out numeroDeEsclavos, out cantidadDeNumeros, USO_CORRECTO)) { return; } int[] numbers = Enumerable.Range(1, cantidadDeNumeros).ToArray(); var stopWatch = Stopwatch.StartNew(); double resultado = 0; using (var ctx = new Context()) { /* Crear socket de envío */ uint PUERTO_ENVIO = ProgramHelper.PUERTO_ENVIO_MASTER; var sendSocket = ctx.Socket(SocketType.PUB); sendSocket.Bind(Transport.TCP, "*", PUERTO_ENVIO); /* Crear socket de recepción */ uint PUERTO_RECEPCION = ProgramHelper.PUERTO_RECEPCION_MASTER; Socket recvSocket = ctx.Socket(SocketType.PULL); recvSocket.Bind(Transport.TCP, "*", PUERTO_RECEPCION); /* Inicializando esclavos */ Debug.WriteLine("Master: Inicializando esclavos"); Task.Factory.StartNew(() => SlaveProgram.EjecutarEsclavos(numeroDeEsclavos)); Thread.Sleep(5); Debug.WriteLine("Master: Esperando a que se inicializen los esclavos."); SlaveProgram.EsperarEsclavosListos(); Debug.WriteLine("Master: Esclavos listos, empieza inicialización de maestro."); using (var master = new SumadorBroadcastMaestro(numbers, ctx, sendSocket, recvSocket)) { Debug.WriteLine("Master: new SumadorBroadcastMaestro(int[{0}], ctx, sendSocket, recvSocket)", numbers.Length); Console.WriteLine("Master: Ejecutando operación maestro."); Debug.Indent(); master.RecepcionesEsperadas = numeroDeEsclavos; master.EjecutarOperacion(); Debug.WriteLine("Master: Esperando a que termine la operacion..."); master.SenalDeFinalizacion.Wait(); Debug.WriteLine("Master: Se recibió la senal de finalización."); Debug.Unindent(); resultado = master.Resultado; } } stopWatch.Stop(); Console.WriteLine("Se tardó: {0} milisegundos", stopWatch.ElapsedMilliseconds); Console.WriteLine("Se tardó: {0} ticks de reloj", stopWatch.ElapsedTicks); Console.WriteLine("Resultado de sumar del 1 al {1}: {0}", resultado, numbers[numbers.Length - 1]); Console.ReadLine(); }
public void TestIfItCanBroadcastData() { // Arrange Context ctx; using (ctx = new Context()) { Socket slaveSendSock1 = null; Socket slaveRecvSock1 = null; Socket slaveSendSock2 = null; Socket slaveRecvSock2 = null; using (slaveSendSock1 = ctx.Socket(SocketType.PUSH)) using (slaveRecvSock1 = ctx.Socket(SocketType.SUB)) using (slaveSendSock2 = ctx.Socket(SocketType.PUSH)) using (slaveRecvSock2 = ctx.Socket(SocketType.SUB)) { /* Organizar sockets para maestro */ /* Envío */ Socket masterSendSocket = ctx.Socket(SocketType.PUB); masterSendSocket.Bind(Transport.TCP, TEST_BIND_ADDR, TEST_PORT); /* Recepción */ Socket masterRecvSocket = ctx.Socket(SocketType.PULL); masterRecvSocket.Bind(Transport.TCP, TEST_BIND_ADDR, TEST_PORT + 1); /* Organizar sockets para esclavos */ /* Envío */ slaveSendSock1.Connect(Transport.TCP, LOCALHOST, TEST_PORT + 1); slaveSendSock2.Connect(Transport.TCP, LOCALHOST, TEST_PORT + 1); /* Recepción */ slaveRecvSock1.Connect(Transport.TCP, LOCALHOST, TEST_PORT); slaveRecvSock1.Subscribe(new byte[] { }); slaveRecvSock2.Connect(Transport.TCP, LOCALHOST, TEST_PORT); slaveRecvSock2.Subscribe(new byte[] { }); int[] numeros = new int[] { 1, 2, 3, 4, 5 }; int[] recibidos1 = null; int[] recibidos2 = null; using (var target = new SumadorBroadcastMaestro(numeros, ctx, masterSendSocket, masterRecvSocket)) { target.RecepcionesEsperadas = 2; var task1 = Task.Factory.StartNew(() => { recibidos1 = slaveRecvSock1.Recv <int[]>(); Thread.Sleep(10); slaveSendSock1.Send(1d); }); var task2 = Task.Factory.StartNew(() => { recibidos2 = slaveRecvSock2.Recv <int[]>(); Thread.Sleep(10); slaveSendSock2.Send(3d); }); // Act Thread.Sleep(100); target.EjecutarOperacion(); task1.Wait(); task2.Wait(); int totalWaitTime = 3000; while (target.RecepcionesRecibidas < 2 && totalWaitTime > 0) { Thread.Sleep(100); totalWaitTime -= 100; } // Assert Assert.That(recibidos1, Is.EquivalentTo(new int[] { 1, 2, 3, 4, 5 })); Assert.That(recibidos2, Is.EquivalentTo(new int[] { 1, 2, 3, 4, 5 })); Assert.That(target.Resultado, Is.EqualTo(4d)); // Reset } } } }