/// <summary>
 /// Envía el mensaje a la MANET
 /// </summary>
 /// <param name="netHandler">El manejador de la red</param>
 /// <param name="ip">la ip de la maquina remota destino</param>
 internal bool send(NetHandler netHandler, IPAddress ip)
 {
     return netHandler.sendTcpMessage(new NetMessage(toByteArray()), ip);
 }
        /// <summary>
        /// Actualiza los parámetros del router
        /// </summary>
        /// <param name="netHandler">El manejador de la red</param>
        /// <param name="netUser">Los datos del usuario local</param>
        /// <param name="netUserList">La lista de usuarios de la red</param>
        public void updateRouterTable(NetHandler netHandler, NetUser netUser, NetUserList netUserList)
        {
            this.netHandler = netHandler;
            this.netUser = netUser;
            this.netUserList = netUserList;

            int newMessageNumber = nMessagesCounted;
            nMessagesCounted = 0;
            int neighborhoodSize = netUser.NeighborhoodIds.Length;
            //se incrementa el numero de iteraciones
            iterations++;
            //actualizo el promedio de cada registro
            messageAverage = ((messageAverage * (iterations - 1) + newMessageNumber) / iterations);
            if (messageAverage > 1)
            {
                //calculo el nuevo tamaño optimo de la lista,
                int size = 1 + (int)(((Math.Log(duplicationProbability, Math.E) / (Math.Log(messageAverage - 1, Math.E) - Math.Log(messageAverage, Math.E)))));
                //si el nuevo tamaño optimo es mayor, se debe aumentar el tamaño de la lista
                if (size > messageIdCollection.MaxSize)
                {
                    messageIdCollection.MaxSize = size;
                }
            }
        }
 /// <summary>
 /// Envía el mensaje a la MANET
 /// </summary>
 /// <param name="netHandler">El manejador de la red</param>
 internal void send(NetHandler netHandler)
 {
     netHandler.sendUdpMessage(new NetMessage(toByteArray()));
 }
 /// <summary>
 /// Constructo Parametrizado
 /// </summary>
 /// <param name="configuration">El objeto con los datos de configuración previamente llenado</param>
 /// <param name="subProtocols">Lista de SubProtocolos</param>
 /// <param name="extraMessageTypes">Tipos de mensajes no especificados en los sub protocolos</param>
 public Communication(Configuration configuration, SubProtocolList subProtocols, MessageTypeList extraMessageTypes)
 {
     try
     {
         this.configuration = configuration;
         if (extraMessageTypes != null)
         {
             messageTypes = extraMessageTypes.Collection;
         }
         else
         {
             messageTypes = new Hashtable();
         }
         if (subProtocols != null)
         {
             Hashtable sub = subProtocols.Collection;
             foreach (DictionaryEntry en in sub)
             {
                 SubProtocolI subProtocol = (SubProtocolI)en.Value;
                 Hashtable spMessageTypes = subProtocol.getMessageTypes().Collection;
                 foreach (DictionaryEntry de in spMessageTypes)
                 {
                     messageTypes.Add(de.Key, de.Value);
                 }
                 subProtocol.sendMessageEvent += internalSendMessage;
             }
             this.subProtocols = sub;
         }
         netHandler = new NetHandler(configuration.NetData, this);
         eventQueuePC = new EventQueuePC();
         eventConsumer = new Thread(new ThreadStart(consumeEvent));
         eventConsumerStarted = false;
         eventConsumerLock = new Object();
         init();
     }
     catch (ThreadAbortException e)
     {
         throw e;
     }
     catch (Exception e)
     {
         throw e;
     }
 }