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); }
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); } }
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; } }
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); }
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(); }
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) { } } }
public bool Remove(ContactNode node) { lock (__rwlock) { return(_nodesMap.Remove(node.Id)); } }
public BucketContactNode(ContactNode node) { Node = node; }
public void SeenNow(ContactNode node) { Replace(node.Id, node); }