public bool Activate() { // bootstrap search from routing foreach (DhtContact contact in Network.Routing.Find(TargetID, 8)) { Add(contact); } List <TcpConnect> sockets = null; // if open send search to proxied nodes just for good measure, probably helps on very small networks if (Core.Firewall == FirewallType.Open) { sockets = Network.TcpControl.ProxyClients; } // if natted send request to proxies for fresh nodes if (Core.Firewall == FirewallType.NAT) { sockets = Network.TcpControl.ProxyServers; } if (sockets != null) { foreach (TcpConnect socket in sockets) { DhtContact contact = new DhtContact(socket, socket.RemoteIP); Network.Searches.SendRequest(contact, TargetID, SearchID, Service, DataType, Parameters); DhtLookup host = Add(socket.GetContact()); if (host != null) { host.Status = LookupStatus.Searching; } } } // if blocked send proxy search request to 1 proxy, record and wait if (Core.Firewall == FirewallType.Blocked && !Network.UseLookupProxies) { // pick random proxy server if (Network.TcpControl.ProxyServers.Count == 0) { return(false); } ProxyTcp = Network.TcpControl.ProxyServers[Core.RndGen.Next(Network.TcpControl.ProxyServers.Count)]; Send_ProxySearchRequest(); } return(true); }
public DhtLookup Add(DhtContact contact) { DhtLookup added = null; if (contact.UserID == Network.Local.UserID && contact.ClientID == Network.Local.ClientID) { return(null); } if (Finished) // search over { return(null); } // go through lookup list, add if closer to target foreach (DhtLookup lookup in LookupList) { if (contact.UserID == lookup.Contact.UserID && contact.ClientID == lookup.Contact.ClientID) { return(lookup); } if ((contact.UserID ^ TargetID) < (lookup.Contact.UserID ^ TargetID)) { added = new DhtLookup(contact); LookupList.Insert(LookupList.IndexOf(lookup), added); break; } } if (added == null) { added = new DhtLookup(contact); LookupList.Add(added); } while (LookupList.Count > LOOKUP_SIZE) { LookupList.RemoveAt(LookupList.Count - 1); } // at end so we ensure this node is put into list and sent with proxy results if (Service == Core.DhtServiceID && contact.UserID == TargetID) { Found(contact, false); } return(added); }
public DhtLookup Add(DhtContact contact) { DhtLookup added = null; if (contact.UserID == Network.Local.UserID && contact.ClientID == Network.Local.ClientID) return null; if(Finished) // search over return null; // go through lookup list, add if closer to target foreach(DhtLookup lookup in LookupList) { if(contact.UserID == lookup.Contact.UserID && contact.ClientID == lookup.Contact.ClientID) return lookup; if((contact.UserID ^ TargetID) < (lookup.Contact.UserID ^ TargetID)) { added = new DhtLookup(contact); LookupList.Insert(LookupList.IndexOf(lookup), added); break; } } if (added == null) { added = new DhtLookup(contact); LookupList.Add(added); } while (LookupList.Count > LOOKUP_SIZE) LookupList.RemoveAt(LookupList.Count - 1); // at end so we ensure this node is put into list and sent with proxy results if (Service == Core.DhtServiceID && contact.UserID == TargetID) Found(contact, false); return added; }