Example #1
0
        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();
        }
Example #2
0
        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
                                }
                            }
            }
        }