/// <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); } }