Exemple #1
0
        public void GetPeersEncode()
        {
            GetPeers m = new GetPeers(id, infohash);

            m.TransactionId = transactionId;

            Compare(m, "d1:ad2:id20:abcdefghij01234567899:info_hash20:mnopqrstuvwxyz123456e1:q9:get_peers1:t2:aa1:y1:qe");
            message = m;
        }
Exemple #2
0
        private async Task SendGetPeers(Node target)
        {
            NodeId distance = target.Id.Xor(infoHash);

            ClosestActiveNodes.Add(distance, target);

            GetPeers m = new GetPeers(engine.LocalId, infoHash);

            activeQueries++;
            var args = await engine.SendQueryAsync(m, target);

            activeQueries--;

            // We want to keep a list of the top (K) closest nodes which have responded
            int index = ClosestActiveNodes.Values.IndexOf(target);

            if (index >= Bucket.MaxCapacity || args.TimedOut)
            {
                ClosestActiveNodes.RemoveAt(index);
            }

            if (args.TimedOut)
            {
                if (activeQueries == 0)
                {
                    tcs.TrySetResult(new Node[0]);
                }
                return;
            }

            GetPeersResponse response = (GetPeersResponse)args.Response;

            // Ensure that the local Node object has the token. There may/may not be
            // an additional copy in the routing table depending on whether or not
            // it was able to fit into the table.
            target.Token = response.Token;
            if (response.Values != null)
            {
                // We have actual peers!
                engine.RaisePeersFound(infoHash, Peer.Decode(response.Values));
            }
            else if (response.Nodes != null)
            {
                // We got a list of nodes which are closer
                IEnumerable <Node> newNodes = Node.FromCompactNode(response.Nodes);
                foreach (Node closer in Node.CloserNodes(infoHash, ClosestNodes, newNodes, Bucket.MaxCapacity))
                {
                    await SendGetPeers(closer);
                }
            }

            if (activeQueries == 0)
            {
                tcs.TrySetResult(ClosestActiveNodes.Values.ToArray());
            }
        }
Exemple #3
0
        public void GetPeersEncode()
        {
            var m = new GetPeers(_id, _infohash)
            {
                TransactionId = _transactionId
            };

            Compare(m, "d1:ad2:id20:abcdefghij01234567899:info_hash20:mnopqrstuvwxyz123456e1:q9:get_peers1:t2:aa1:y1:qe");
            _message = m;
        }
Exemple #4
0
        public void GetPeersDecode()
        {
            string   text = "d1:ad2:id20:abcdefghij01234567899:info_hash20:mnopqrstuvwxyz123456e1:q9:get_peers1:t2:aa1:y1:qe";
            GetPeers m    = (GetPeers)Decode(text);

            Assert.AreEqual(infohash, m.InfoHash, "#1");
            Assert.AreEqual(id, m.Id, "#2");
            Assert.AreEqual(transactionId, m.TransactionId, "#3");

            Compare(m, text);
        }
Exemple #5
0
        private void SendGetPeers(Node n)
        {
            NodeId distance = n.Id.Xor(infoHash);

            queriedNodes.Add(distance, n);

            activeQueries++;
            GetPeers      m    = new GetPeers(engine.LocalId, infoHash);
            SendQueryTask task = new SendQueryTask(engine, m, n);

            task.Completed += GetPeersCompleted;
            task.Execute();
        }
Exemple #6
0
        private void SendGetPeers(Node n)
        {
            var distance = n.Id.Xor(_infoHash);

            if (ClosestActiveNodes.ContainsKey(distance))
            {
                return;
            }
            ClosestActiveNodes.Add(distance, n);

            _activeQueries++;
            var m    = new GetPeers(_engine.LocalId, _infoHash);
            var task = new SendQueryTask(_engine, m, n);

            task.Completed += GetPeersCompleted;
            task.Execute();
        }
Exemple #7
0
        public void GetPeersEncode()
        {
            var m = new GetPeers(_id, _infohash) {TransactionId = _transactionId};

            Compare(m, "d1:ad2:id20:abcdefghij01234567899:info_hash20:mnopqrstuvwxyz123456e1:q9:get_peers1:t2:aa1:y1:qe");
            _message = m;
        }
Exemple #8
0
        private void SendGetPeers(Node n)
        {
            NodeId distance = n.Id.Xor(infoHash);
            queriedNodes.Add(distance, n);

            activeQueries++;
            GetPeers m = new GetPeers(engine.LocalId, infoHash);
            SendQueryTask task = new SendQueryTask(engine, m, n);
            task.Completed += GetPeersCompleted;
            task.Execute();
        }