예제 #1
0
        public static bool TryParse(BDictionary message, out FindNodeQuery query)
        {
            if (message.Contains("q", new BString("find_node")) &&
                message.TryGetValue("t", out BString transactionId) && transactionId.Length > 0 &&
                message.TryGetValue("a", out BDictionary arguments) &&
                arguments.TryGetValue("id", out BString nodeId) && nodeId.Length == NodeID.Size &&
                arguments.TryGetValue("target", out BString targetId) && targetId.Length == NodeID.Size)
            {
                query = new FindNodeQuery(new TransactionID(transactionId), new NodeID(nodeId), new NodeID(targetId));
                if (arguments.TryGetValue("want", out BList wantList))
                {
                    if (wantList.Contains(new BString("n4")))
                    {
                        query.Want |= Want.IPv4Nodes;
                    }
                    if (wantList.Contains(new BString("n6")))
                    {
                        query.Want |= Want.IPv6Nodes;
                    }
                }
                return(true);
            }

            query = null;
            return(false);
        }
예제 #2
0
        public static bool TryParse(BDictionary message, out PingQuery query)
        {
            if (message.Contains("q", new BString("ping")) &&
                message.TryGetValue("t", out BString transactionId) && transactionId.Length > 0 &&
                message.TryGetValue("a", out BDictionary arguments) &&
                arguments.TryGetValue("id", out BString nodeId) && nodeId.Length == NodeID.Size)
            {
                query = new PingQuery(new TransactionID(transactionId), new NodeID(nodeId));
                return(true);
            }

            query = null;
            return(false);
        }
예제 #3
0
        public static bool TryParse(BDictionary message, out GetPeersQuery query)
        {
            if (message.Contains("q", new BString("get_peers")) &&
                message.TryGetValue("t", out BString transactionId) && transactionId.Length > 0 &&
                message.TryGetValue("a", out BDictionary arguments) &&
                arguments.TryGetValue("id", out BString nodeId) && nodeId.Length == NodeID.Size &&
                arguments.TryGetValue("info_hash", out BString infoHash) && infoHash.Length == InfoHash.Size)
            {
                query = new GetPeersQuery(new TransactionID(transactionId), new NodeID(nodeId), new InfoHash(infoHash));
                if (arguments.TryGetValue("want", out BList wantList))
                {
                    if (wantList.Contains(new BString("n4"))) query.Want |= Want.IPv4Nodes;
                    if (wantList.Contains(new BString("n6"))) query.Want |= Want.IPv6Nodes;
                }
                return true;
            }

            query = null;
            return false;
        }
예제 #4
0
        public static bool TryParse(BDictionary message, out AnnouncePeerQuery query)
        {
            if (message.Contains("q", new BString("announce_peer")) &&
                message.TryGetValue("t", out BString transactionId) && transactionId.Length > 0 &&
                message.TryGetValue("a", out BDictionary arguments) &&
                arguments.TryGetValue("id", out BString nodeId) && nodeId.Length == NodeID.Size &&
                arguments.TryGetValue("info_hash", out BString infoHash) && infoHash.Length == InfoHash.Size &&
                arguments.TryGetValue("token", out BString token) && token.Length > 0 &&
                arguments.TryGetValue("port", out BInteger port) && port.Value >= 0 && port.Value < 65536)
            {
                bool impliedPort = false;
                if (arguments.TryGetValue("implied_port", out BInteger impliedPortValue))
                {
                    impliedPort = impliedPortValue.Value == 1;
                }

                query = new AnnouncePeerQuery(
                    new TransactionID(transactionId), new NodeID(nodeId), new InfoHash(infoHash), new PeerToken(token), (int)port.Value, impliedPort);
                return(true);
            }

            query = null;
            return(false);
        }