public void SecondTimer() { // ip cache lock (IPs) while (IPs.Count > MAX_CACHE) { DhtContact entry = IPs.Last.Value; IPTable.Remove(entry.CacheHash()); IPs.RemoveLast(); } // save cache if (Core.TimeNow > NextSave) { if (Network.IsLookup) { Network.Lookup.Save(Core); } else { Core.User.Save(); } NextSave = Core.TimeNow.AddMinutes(5); } // if unresponsive if (!Network.Responsive) { Retry.Timer(); if (Network.IsLookup) { LoookupBootstrap(); } else { OpBootstrap(); } } // send broadcast in lan mode every 20 secs if (Network.LanMode)//&& !IsLookup) //crit re-enable? { // if disconnected from LAN, once reconnected, establishing should be < 20 secs if (BroadcastTimeout <= 0) { Ping ping = new Ping(); ping.Source = Network.GetLocalSource(); Network.LanControl.SendTo(ping); BroadcastTimeout = 20; } else { BroadcastTimeout--; } } }
public void AddContact(DhtContact entry) { lock (IPs) { if (IPTable.ContainsKey(entry.CacheHash())) { entry = IPTable[entry.CacheHash()].Value; // replace entry with dupe to maintain next try info IPs.Remove(entry); } // sort nodes based on last seen LinkedListNode <DhtContact> node = null; for (node = IPs.First; node != null; node = node.Next) { if (entry.LastSeen > node.Value.LastSeen) { break; } } IPTable[entry.CacheHash()] = (node != null) ? IPs.AddBefore(node, entry) : IPs.AddLast(entry); } }