/// <summary> /// Actualiza los datos de la lista de usuarios /// </summary> private void updateUserList() { NetUser[] netUsers = netUserList.userListToArray(); for (int i = 0; i < netUsers.Length; i++) { //decrementa el time out, para algoritmo de perdida de señal netUsers[i].qualityDown(configuration.NetData); //si llega a cero el time out, se ha ido de la red, hay que sacarlo if (netUsers[i].Timeout < 0) { disconnectNetUser(netUsers[i]); } else { if (netUsers[i].SignalQuality == NetUserQuality.LOW || netUsers[i].SignalQuality == NetUserQuality.NORMAL) { RemoteMachine remoteMachine = netHandler.TcpServerList.getRemoteMachine(netUsers[i].Ip); if (remoteMachine == null && netUsers[i].JumpsAway == 1) { if (netUsers[i].WaitTimeOut <= 0) { netUsers[i].WaitTimeOut = configuration.NetData.WaitForTCPConnection; netHandler.connectTo(netUsers[i].Ip); } else { netUsers[i].WaitTimeOut--; } } } produceEvent(CommunicationEvent.REFRESHUSER, netUsers[i]); } } }
/// <summary> /// Encuentra el camino mas corto hacia el destinatario de un mensaje y retorna la ip del vecino que se encuentra en el camino /// </summary> /// <param name="receiverNetUser">El usuario destinatario del mensaje</param> /// <returns>Un string con la IP del remote machine vecino que se encuentra en el camino óptimo</returns> private IPAddress pathNextIp(NetUser receiverNetUser) { NetUser[] listedNodes = netUserList.userListToArray(); //Se chequea que existan al menos dos usuarios mas if (listedNodes.Length < 2) { for (int i = 0; i < netUser.NeighborhoodIds.Length; i++) { if (netUser.NeighborhoodIds[i].Equals(receiverNetUser.Id)) { return(receiverNetUser.Ip); } } //no existe conexion con ese usuario return(null); } IPAddress ip = null; //Se crea el array de nodos del grafo List <NetUser> nodes = new List <NetUser>(); nodes.Add(netUser); int receiberIndex = -1; for (int i = 0; i < listedNodes.Length; i++) { nodes.Add(listedNodes[i]); if (receiverNetUser.Id.Equals(listedNodes[i].Id)) { receiberIndex = i + 1; } } if (receiberIndex != -1) { //Se ejecuta el algoritmo de Dijkstra para encontrar el orden de los indices de los nodos con el camino optimo Dijkstra dijkstra = new Dijkstra(nodes, netHandler.NetData); int[] nodeIndexes = dijkstra.GetMinimumPath(0, receiberIndex); if (nodeIndexes.Length > 0) { ip = nodes[nodeIndexes[0]].Ip; if (ip.Equals(receiverNetUser.Ip)) { for (int i = 0; i < netUser.NeighborhoodIds.Length; i++) { if (netUser.NeighborhoodIds[i].Equals(receiverNetUser.Id)) { return(receiverNetUser.Ip); } } return(null); } } } return(ip); }