/// <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))); } } }
/// <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; }
/// <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{ } }
/// <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(); }
/// <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; }