Exemple #1
0
        /// <summary>
        /// Adds dns records to cache. If old entry exists, it is replaced.
        /// </summary>
        /// <param name="qname">Query name.</param>
        /// <param name="qtype">Query type.</param>
        /// <param name="response">DNS server response.</param>
        /// <exception cref="ArgumentNullException">Is raised when <b>qname</b> or <b>response</b> is null reference.</exception>
        /// <exception cref="ArgumentException">Is raised when any of the arguments has invalid value.</exception>
        public void AddToCache(string qname,int qtype,DnsServerResponse response)
        {
            if(qname == null){
                throw new ArgumentNullException("qname");
            }
            if(qname == string.Empty){
                throw new ArgumentException("Argument 'qname' value must be specified.","qname");
            }
            if(response == null){
                throw new ArgumentNullException("response");
            }

            lock(m_pCache){
                // Remove old cache entry, if any.
                if(m_pCache.ContainsKey(qname + qtype)){
                    m_pCache.Remove(qname + qtype);
                }

                if(response.ResponseCode == DNS_RCode.NO_ERROR){
                    int ttl = m_MaxCacheTtl;
                    // Search smallest DNS record TTL and use it.
                    foreach(DNS_rr rr in response.AllAnswers){
                        if(rr.TTL < ttl){
                            ttl = rr.TTL;
                        }
                    }

                    m_pCache.Add(qname + qtype,new CacheEntry(response,DateTime.Now.AddSeconds(ttl)));
                }
                else{
                    m_pCache.Add(qname + qtype,new CacheEntry(response,DateTime.Now.AddSeconds(m_MaxNegativeCacheTtl)));
                }
            }
        }
Exemple #2
0
 /// <summary>
 /// Default constructor.
 /// </summary>
 /// <param name="answers">Dns answers.</param>
 /// <param name="addTime">Entry add time.</param>
 public DnsCacheEntry(DnsServerResponse answers,DateTime addTime)
 {
     m_pResponse = answers;
     m_Time      = addTime;
 }
Exemple #3
0
        /// <summary>
        /// Adds dns records to cache. If old entry exists, it is replaced.
        /// </summary>
        /// <param name="qname"></param>
        /// <param name="qtype"></param>
        /// <param name="answers"></param>
        public static void AddToCache(string qname,int qtype,DnsServerResponse answers)
        {
            if(answers == null){
                return;
            }

            try{
                lock(m_pCache){
                    // Remove old cache entry, if any.
                    if(m_pCache.Contains(qname + qtype)){
                        m_pCache.Remove(qname + qtype);
                    }
                    m_pCache.Add(qname + qtype,new DnsCacheEntry(answers,DateTime.Now));
                }
            }
            catch{
            }
        }
Exemple #4
0
            /// <summary>
            /// Gets A and AAAA records from DNS server additional responses section.
            /// </summary>
            /// <param name="name">Host name.</param>
            /// <param name="response">DNS server response.</param>
            /// <returns>Returns A and AAAA records from DNS server additional responses section.</returns>
            /// <exception cref="ArgumentNullException">Is raised when <b>name</b> or <b>response</b> is null reference.</exception>
            private IPAddress[] Get_A_or_AAAA_FromResponse(string name,DnsServerResponse response)
            {
                if(name == null){
                    throw new ArgumentNullException("name");
                }
                if(response == null){
                    throw new ArgumentNullException("response");
                }

                List<IPAddress> aList = new List<IPAddress>();
                List<IPAddress> aaaaList = new List<IPAddress>();

                foreach(DNS_rr rr in response.AdditionalAnswers){
                    if(string.Equals(name,rr.Name,StringComparison.InvariantCultureIgnoreCase)){
                        if(rr is DNS_rr_A){
                            aList.Add(((DNS_rr_A)rr).IP);
                        }
                        else if(rr is DNS_rr_AAAA){
                            aaaaList.Add(((DNS_rr_AAAA)rr).IP);
                        }
                    }
                }

                // We list IPv4 first and then IPv6 addresses.
                aList.AddRange(aaaaList);

                return aList.ToArray();
            }
Exemple #5
0
            /// <summary>
            /// Default constructor.
            /// </summary>
            /// <param name="response">DNS server response.</param>
            /// <param name="expires">Time when cache entry expires.</param>
            /// <exception cref="ArgumentNullException">Is raised when <b>response</b> is null reference.</exception>
            public CacheEntry(DnsServerResponse response,DateTime expires)
            {
                if(response == null){
                    throw new ArgumentNullException("response");
                }

                m_pResponse = response;
                m_Expires   = expires;
            }