Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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;
        }