/// <summary>
 /// Procesa un mensaje que no ha podido ser envíado correctamente
 /// </summary>
 /// <param name="message">El mensaje</param>
 internal void routerMessageErrorHandler(Message message)
 {
     //ImAliveMessage
     if (message.Type == MessageType.IMALIVE)
     {
         ImAliveMessage imAliveMessage = (ImAliveMessage)message;
         produceEvent(CommunicationEvent.NETINFORMATION, "ROUTER: message delivery fail " + imAliveMessage.ToString());
     }
     //AckMessage
     else if (message.Type == MessageType.ACK)
     {
         AckMessage ackMessage = (AckMessage)message;
         produceEvent(CommunicationEvent.NETINFORMATION, "ROUTER: message delivery fail " + ackMessage.ToString());
     }
     //Resto de los mensajes
     else
     {
         SubProtocolI subProtocol = (SubProtocolI)subProtocols[message.ProtocolType];
         if (subProtocol != null)
         {
             eventQueuePC.put(new Event(new MessageEvent(subProtocol.errorMessage), message));
         }
         else
         {
             produceEvent(CommunicationEvent.ERRORMESSAGE, message);
         }
         produceEvent(CommunicationEvent.NETINFORMATION, "ROUTER: message delivery fail " + message.ToString());
     }
 }
        /// <summary>
        /// Procesa un mensaje recibido
        /// </summary>
        /// <param name="message">El mensaje recibido</param>
        private void proccessMessage(Message message)
        {
            if (message != null)
            {
                //registra la ip del mensaje recibido en el manejador de Ips, previo chequeo de que el mensaje no es de
                //este mismo usuario
                if (!message.SenderNetUser.Id.Equals(configuration.NetUser.Id))
                {
                    netHandler.registerIp(message.SenderNetUser.Ip);
                }

                //verifica que se recibe el mensaje de un usuario conocido
                NetUser listedNetUser = netUserList.getUser(message.SenderNetUser.Ip);

                //ImAliveMessage
                if (message.Type == MessageType.IMALIVE)
                {
                    if (listedNetUser == null)
                    {
                        newNetUser(message.SenderNetUser);
                    }
                    else if (!listedNetUser.Id.Equals(message.SenderNetUser.Id))
                    {
                        disconnectNetUser(listedNetUser);
                    }
                    else
                    {
                        listedNetUser.qualityUp(configuration.NetData);
                        listedNetUser.NeighborhoodIds = message.SenderNetUser.NeighborhoodIds;
                        listedNetUser.JumpsAway = message.Jumps;
                        listedNetUser.State = message.SenderNetUser.State;
                        listedNetUser.UpLayerData = message.SenderNetUser.UpLayerData;
                    }
                    //produceEvent(CommunicationEvent.NETINFORMATION, "recibido: " + subProtocol.ToString());
                }
                //AckMessage
                else if (message.Type == MessageType.ACK)
                {
                    AckMessage ackMessage = (AckMessage)message;
                    router.proccessAckMessage(ackMessage);
                    //produceEvent(CommunicationEvent.NETINFORMATION, "recibidos: " + subProtocol.ToString());
                }
                //Resto de los mensajes
                else
                {
                    if (listedNetUser != null && listedNetUser.Id.Equals(message.SenderNetUser.Id))
                    {
                        message.SenderNetUser = listedNetUser;
                        SubProtocolI subProtocol = (SubProtocolI)subProtocols[message.ProtocolType];
                        if (subProtocol != null)
                        {
                            eventQueuePC.put(new Event(new MessageEvent(subProtocol.proccessMessage), message));
                        }
                        else
                        {
                            produceEvent(CommunicationEvent.PROCESSMESSAGE, message);
                        }
                        produceEvent(CommunicationEvent.NETINFORMATION, "COMMUNICATION: received " + message.ToString());
                    }
                    else
                    {
                        message.SenderNetUser.Name = "Unknown (" + message.SenderNetUser.Ip.ToString() + ")";
                        SubProtocolI subProtocol = (SubProtocolI)subProtocols[message.ProtocolType];
                        if (subProtocol != null)
                        {
                            eventQueuePC.put(new Event(new MessageEvent(subProtocol.proccessMessage), message));
                        }
                        else
                        {
                            produceEvent(CommunicationEvent.PROCESSMESSAGE, message);
                        }
                        produceEvent(CommunicationEvent.NETINFORMATION, "COMMUNICATION: unknown message  " + message.ToString());
                    }
                }
            }
        }
 /// <summary>
 /// Envía un mensaje de forma interna aplicando filtros
 /// </summary>
 /// <param name="message">el mensaje a enviar</param>
 internal void internalSendMessage(Message message)
 {
     try
     {
         if (configuration.NetUser.Ip != null)
         {
             message.SenderNetUser = configuration.NetUser;
             router.queueMessageToSend(message);
             if (message.Type != MessageType.IMALIVE && message.Type != MessageType.ACK)
             {
                 produceEvent(CommunicationEvent.NETINFORMATION, "COMMUNICATION: queued " + message.ToString());
             }
         }
     }
     catch (ThreadAbortException e)
     {
         throw e;
     }
     catch (Exception e)
     {
         produceEvent(CommunicationEvent.NETINFORMATION, "COMMUNICATION: impossible to send this message " + e.Message);
     }
 }