Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="req"></param>
        internal void ReceiveHearbeat(SendHeartbeat req)
        {
            string message = req.HbData;

            HeartBeat hb = HeartBeat.CreateHeartBeatFromString(message);

            // Obteniendo datos del emisor
            string senderIP   = string.Empty;
            string senderPipe = string.Empty;
            int    senderPort = 0;

            // Temp. Usar if para separar dos posibles senders hasta ahora. Si se incrementan, cambiar por switch..
            if (req.SenderType == TransportType.TransportUdp)
            {
                senderIP   = req.IpAddress;
                senderPort = req.Port;
            }

            if (req.SenderType == TransportType.TransportPipe)
            {
                senderPipe = req.PipeName;
            }

            ClientData client = null;

            // Chequear ClientID.
            // Chequear primero si hb.id es null
            if (null == hb.ClientID)
            {
                // usar puerto
                // TODO Separar chequeos en dependencia de tipo de emisor
                if (_clientList.ContainsPort(senderPort))
                {
                    client = _clientList.GetClient(senderPort);
                }
            }
            else
            {
                // usar ID
                if (_clientList.ContainsId(hb.ClientID))
                {
                    client = _clientList.GetClient(hb.ClientID);
                }
            }


            if (client == null)
            {
                // Para Debug y advertencia
                message = string.Format(ClassName + ": Cliente NO REGISTRADO. IP: {0}  Port: {1} Client: {2} Text: {3}  Serial: {4}.", senderIP, senderPort, hb.ClientID, hb.Timestamp, hb.Serial);
                Builder.Output(message, TraceEventType.Warning);
                // Debug
                return;

                //ToDo Al terminar depuracion implementar log y notificacion
                throw new Exception("Cliente no registrado.");
            }

            // DEBUG Output Hb recibido
            string nombre = client.Name;
            string id     = hb.ClientID ?? "No establecida";
            string serial = hb.Serial ?? "No establecido";

            message = string.Format(ClassName + ": Recibe Cliente: {0} con Id {1} IP: {2} Puerto: {3} TS: {4} Serial: {5}.", nombre, id, senderIP, senderPort, hb.Timestamp, serial);
            Builder.Output(message, TraceEventType.Verbose);

            // Realizando comprobacion de puerto si el cliente lo especifica. Se puede comprobar la IP, pero no esta
            // incorporada en los datos del cliente.
            if (client.IdType == ClientIdType.KeyByUdpPort)
            {
                if (client.Port != senderPort)
                {
                    //TODO implementar notificacion.
                    message = string.Format(ClassName + ": Cliente {0} tiene configurado puerto UDP: {1} pero transmite por el {2}.", client.Name, client.Port, senderPort);
                    Builder.Output(message, TraceEventType.Warning);
                }
            }

            client.HeartBeat = string.IsNullOrEmpty(hb.Serial) ? hb.Timestamp : hb.Timestamp + "\t" + hb.Serial;

            if (client.Status == ClientStatus.Inicial)
            {
                ClientMoveToWorkList(client);
            }

            if (client.Status == ClientStatus.Reiniciado)
            {
                ClientRecoverToWorkList(client);
            }

            if (client.Status == ClientStatus.Muerto)
            {
                ClientRecoverFromDeadToWorkList(client);
            }
        }