public bool Delete(Id infoHash, ContactNode contact)
        {
            SortedSet <ContactNode> peersSet = null;

            if (_infoHash2Nodes.TryGetValue(infoHash, out peersSet))
            {
                lock (peersSet) {
                    peersSet.Remove(contact);
                }

                return(true);
            }

            return(false);
        }
예제 #2
0
        public void Put(ContactNode node)
        {
            lock (__rwlock) {
                if (IsFull())
                {
                    throw new Exception("Bucket is full");
                }

                var newNode = new BucketContactNode(node)
                {
                    LastUsed = DateTime.UtcNow
                };
                LastUpdated = DateTime.UtcNow;

                _nodesMap.Add(node.Id, newNode);
            }
        }
예제 #3
0
        public void Replace(Id oldId, ContactNode newNode)
        {
            var added = new BucketContactNode(newNode)
            {
                LastUsed = DateTime.UtcNow
            };

            lock ( __rwlock ) {
                if (!_nodesMap.ContainsKey(oldId))
                {
                    return;
                }

                var replaced = _nodesMap[oldId];
                _nodesMap.Remove(oldId);
                _nodesMap[added.Node.Id] = added;
            }
        }
예제 #4
0
        public BucketPutResult Put(ContactNode node)
        {
            var bucket = GetBucket(node.Id);

            if (bucket.IsFull())
            {
                return(BucketPutResult.BucketIsFull);
            }

            if (bucket.Contains(node.Id))
            {
                bucket.SeenNow(node);
                return(BucketPutResult.Updated);
            }

            bucket.Put(node);

            return(BucketPutResult.Success);
        }
        public bool Put(ContactNode contact, Id infoHash)
        {
            if (_infoHash2Nodes.ContainsKey(infoHash))
            {
                SortedSet <ContactNode> peersSet = null;
                if (_infoHash2Nodes.TryGetValue(infoHash, out peersSet))
                {
                    lock (peersSet) {
                        peersSet.Add(contact);
                    }
                }
            }
            else
            {
                SortedSet <ContactNode> peersSet = new SortedSet <ContactNode>(new ContactNode.IdComparer());
                peersSet.Add(contact);
                _infoHash2Nodes.AddOrUpdate(infoHash, peersSet, (nv, ov) => ov);
            }

            return(true);
        }
예제 #6
0
        public void FindPeers()
        {
            Node node = new Node(new System.Net.IPEndPoint(IPAddress.Any, 8881));

            ContactNode qbitContact = new ContactNode(Id.GenerateRandom(), new IPEndPoint(IPAddress.Loopback, 8999));

            MnlMessage pingResp = node.Ping(qbitContact);

            qbitContact = new ContactNode(new Id((byte[])pingResp.Payload["id"]), qbitContact.EndPoint);

            node.BucketList.Put(qbitContact);

            HashTable hashTable = new HashTable(node, new IPEndPoint[] { new IPEndPoint(IPAddress.Loopback, 8999) }, 8881);

            Id infoHash = new Id(ParseTest.ConvertHexStringToByteArray("139f69de76a07790ec3ad31cbc3bd5d905871600"));

            var foundPeers = hashTable.FindPeers(infoHash);

            Assert.IsTrue(foundPeers.Count() > 0);

            node.Shutdown();
        }
예제 #7
0
        private void QueryHashTable(CancellationToken cancelToken) {
            lock(__searchLock) {
                Debug.WriteLine($"Starting info hash query");
                var peersPool = HashTable.FindPeers(new Id(_client.Metainfo.InfoHash), cancelToken);
                try {
                    while(true) {
                        ContactNode peer = peersPool.Take(cancelToken);
                        if(peer == null) {
                            _peers.Add(null);
                            break;
                        }

                        IPAddress contactAdddres = peer.EndPoint.Address;
                        if(!_peersHave.Contains(peer.EndPoint.Address.ToString())) {
                            _peers.Add(new Peer(peer.EndPoint.Address, peer.UtpPort));
                            _peersHave.Add(peer.EndPoint.Address.ToString());
                        }

                    }
                } catch(OperationCanceledException) { }
            }
        }
예제 #8
0
 public bool Remove(ContactNode node)
 {
     lock (__rwlock) {
         return(_nodesMap.Remove(node.Id));
     }
 }
예제 #9
0
 public BucketContactNode(ContactNode node)
 {
     Node = node;
 }
예제 #10
0
 public void SeenNow(ContactNode node)
 {
     Replace(node.Id, node);
 }