예제 #1
0
        public IList <DHTNode> FindNodes(byte[] id)
        {
            DHTNode[] values;
            lock (fLock) {
                values = fKTable.Values.ToArray();
            }

            if (values.Length <= 8)
            {
                return(values);
            }

            var list      = new SortedList <byte[], DHTNode>(8, RouteComparer.Instance);
            var minTime   = DateTime.MaxValue.Ticks;
            var tableFull = fKTable.Count >= fMaxNodeSize;

            foreach (var item in values)
            {
                if (tableFull && DateTime.Now.Ticks - item.LastUpdateTime > fRouteLife.Ticks)
                {
                    fKTable.Remove(item.RouteId);
                    continue;
                }
                var distance = DHTHelper.ComputeRouteDistance(item.ID, id);
                if (list.Count >= 8)
                {
                    if (RouteComparer.Instance.Compare(list.Keys[0], distance) >= 0)
                    {
                        continue;
                    }
                    list.RemoveAt(0);
                }
                list.Add(distance, item);
                minTime = Math.Min(fMinLastTime, item.LastUpdateTime);
            }
            fMinLastTime = Math.Max(minTime, fMinLastTime);
            return(list.Values);
        }