Ejemplo n.º 1
0
        private async Task ProcessResponseAsync(DhtMessage msg, DhtNode responseNode)
        {
            _kTable.AddOrUpdateNode(responseNode);
            object         nodeInfo;
            ISet <DhtNode> nodes = null;

            switch (msg.CommandType)
            {
            case CommandType.Find_Node:
                if (_kTable.IsFull || !msg.Data.TryGetValue("nodes", out nodeInfo))
                {
                    return;
                }
                nodes = DhtNode.ParseNode((byte[])nodeInfo);
                break;

            case CommandType.Get_Peers:
                var hashByte = msg.Get <byte[]>("info_hash");
                var infoHash = new InfoHash(hashByte);
                if (msg.Data.TryGetValue("values", out nodeInfo))
                {
                    IList <object> peerInfo;
                    if (nodeInfo is byte[] bytes)
                    {
                        peerInfo = new object[] { bytes };
                    }
                    else
                    {
                        peerInfo = (IList <object>)nodeInfo;
                    }
                    var peers = new HashSet <IPEndPoint>(peerInfo.Count);
                    foreach (var t in peerInfo)
                    {
                        var peer  = (byte[])t;
                        var point = DhtNode.ParsePeer(peer, 0);
                        if (point.Address.IsPublic())
                        {
                            peers.Add(point);
                        }
                    }
                    if (peers.Count > 0)
                    {
                        infoHash.Peers = peers;
                        if (OnFindPeer != null)
                        {
                            await OnFindPeer(infoHash);
                        }
                        return;
                    }
                }
                if (msg.Data.TryGetValue("nodes", out nodeInfo))
                {
                    if (!(nodeInfo is byte[]))
                    {
                        return;
                    }
                    nodes = DhtNode.ParseNode((byte[])nodeInfo);
                    foreach (var node in nodes)
                    {
                        _kTable.AddNode(node);
                        GetPeers(node, infoHash.Bytes);
                    }
                }
                break;
            }
            if (nodes != null)
            {
                foreach (var node in nodes)
                {
                    _nodeQueue.TryAdd(node);
                    _kTable.AddNode(node);
                }
            }
        }