Пример #1
0
        /// <summary>
        /// Do an QClass=IN Query on specified DNS servers
        /// </summary>
        /// <param name="name">Name to query</param>
        /// <param name="qtype">Question type</param>
        /// <returns>Response of the query</returns>
        public Response Query(string name, QType qtype)
        {
            Question question = new Question(name, qtype, QClass.IN);
            Response response = SearchInCache(question);
            if (response != null)
                return response;

            Request request = new Request();
            request.AddQuestion(question);
            return GetResponse(request);
        }
Пример #2
0
        private Response SearchInCache(Question question)
        {
            if (!m_UseCache)
                return null;

            string strKey = question.QClass + "-" + question.QType + "-" + question.QName;

            Response response = null;

            lock (m_ResponseCache)
            {
                if (!m_ResponseCache.ContainsKey(strKey))
                    return null;

                response = m_ResponseCache[strKey];
            }

            int TimeLived = (int)((DateTime.Now.Ticks - response.TimeStamp.Ticks) / TimeSpan.TicksPerSecond);
            foreach (RR rr in response.ResourceRecords)
            {
                rr.TimeLived = TimeLived;
                // The TTL property calculates its actual time to live
                if (rr.TTL == 0)
                    return null; // out of date
            }
            return response;
        }
Пример #3
0
        /// <summary>
        /// Do Query on specified DNS servers
        /// </summary>
        /// <param name="name">Name to query</param>
        /// <param name="qtype">Question type</param>
        /// <param name="timeout">Timeout for lookup in seconds.</param>
        /// <param name="qclass">Class type</param>
        /// <returns>Response of the query</returns>
        public DNSResponse Query(string name, DNSQType qtype, QClass qclass, int timeout)
        {
            Question question = new Question(name, qtype, qclass);
            DNSResponse response = SearchInCache(question);
            if (response != null)
                return response;

            DNSRequest request = new DNSRequest();
            request.AddQuestion(question);
            return GetResponse(request, m_DnsServers, timeout);
        }
Пример #4
0
        public DNSResponse Query(string name, DNSQType qtype, int timeout, List<IPEndPoint> dnsServers)
        {
            Question question = new Question(name, qtype, QClass.IN);
            DNSResponse response = SearchInCache(question);
            if (response != null)
                return response;

            DNSRequest request = new DNSRequest();
            request.AddQuestion(question);
            return GetResponse(request, dnsServers, timeout);
        }
Пример #5
0
        private DNSResponse SearchInCache(Question question)
        {
            if (!m_UseCache)
            {
                return null;
            }

            string strKey = question.QClass + "-" + question.QType + "-" + question.QName;

            //logger.Debug("Checking cache for " + strKey + ".");

            lock (m_lookupFailures)
            {
                if (m_lookupFailures.ContainsKey(strKey))
                {
                    //logger.Debug("DNS cache failed result found for " + strKey + ".");

                    if (DateTime.Now.Subtract(m_lookupFailures[strKey].TimeStamp).TotalSeconds < FAILURE_RETRY)
                    {
                        return m_lookupFailures[strKey];
                    }
                    else
                    {
                        m_lookupFailures.Remove(strKey);
                        return null;
                    }
                }
            }

            DNSResponse response = null;

            lock (m_ResponseCache)
            {
                if (!m_ResponseCache.ContainsKey(strKey))
                {
                    //logger.Debug("DNS cache no result found for " + strKey + ".");
                    return null;
                }

                response = m_ResponseCache[strKey];

                if (response.Answers.Count == 0)
                {
                    // A response should not have been cached with no answer records.
                    m_ResponseCache.Remove(strKey);
                    return null;
                }
            }

            //int TimeLived = (int)((DateTime.Now.Ticks - response.TimeStamp.Ticks) / TimeSpan.TicksPerSecond);
            int secondsLived = (int)(DateTime.Now.Subtract(response.TimeStamp).TotalSeconds % Int32.MaxValue);
            //logger.Debug("Seconds lived=" + secondsLived + ".");
            foreach (RR rr in response.RecordsRR)
            {
                //rr.TimeLived = TimeLived;
                // The TTL property calculates its actual time to live
                if (secondsLived >= rr.TTL)
                {
                    //logger.Debug("DNS cache out of date result found for " + strKey + ".");
                    return null; // out of date
                }
            }

            //logger.Debug("DNS cache curent result found for " + strKey + ".");
            return response;
        }
Пример #6
0
 /// <summary>
 /// Do an QClass=IN Query on the previously cached results.
 /// </summary>
 /// <param name="name">Name to query</param>
 /// <param name="qtype">Question type</param>
 /// <returns>Response of the query</returns>
 public DNSResponse QueryCache(string name, DNSQType qtype, QClass qclass)
 {
     Question question = new Question(name, qtype, qclass);
     return SearchInCache(question);
 }
Пример #7
0
        private static byte[] GetRequestBytes(IEnumerable<string> protocols)
        {
            var req = new Request();

            foreach (var protocol in protocols)
            {
                var question = new Question(protocol, QType.ANY, QClass.ANY);

                req.AddQuestion(question);
            }

            return req.Data;
        }
Пример #8
0
		public void AddQuestion(Question question)
		{
			Questions.Add(question);
		}
Пример #9
0
 public void AddQuestion(Question question)
 {
     questions.Add(question);
 }
Пример #10
0
        /// <summary>
        /// Do an QClass=IN Query on the previously cached results.
        /// </summary>
        /// <param name="name">Name to query</param>
        /// <param name="qtype">Question type</param>
        /// <returns>Response of the query</returns>
        public DNSResponse QueryCache(string name, QType qtype, QClass qclass)
        {
            Question question = new Question(name, qtype, qclass);

            return(SearchInCache(question));
        }
Пример #11
0
        private DNSResponse SearchInCache(Question question)
        {
            if (!m_UseCache)
            {
                return(null);
            }

            string strKey = question.QClass + "-" + question.QType + "-" + question.QName;

            //logger.LogDebug($"Searching DNS results cache for {strKey}.");

            lock (m_lookupFailures)
            {
                if (m_lookupFailures.ContainsKey(strKey))
                {
                    if (DateTime.Now.Subtract(m_lookupFailures[strKey].TimeStamp).TotalSeconds < FAILURE_RETRY)
                    {
                        return(m_lookupFailures[strKey]);
                    }
                    else
                    {
                        m_lookupFailures.Remove(strKey);
                        return(null);
                    }
                }
            }

            DNSResponse response = null;

            lock (m_ResponseCache)
            {
                if (!m_ResponseCache.ContainsKey(strKey))
                {
                    return(null);
                }

                response = m_ResponseCache[strKey];

                if (response.Answers.Count == 0)
                {
                    // A response should not have been cached with no answer records.
                    m_ResponseCache.Remove(strKey);
                    return(null);
                }
            }

            int TimeLived    = (int)((DateTime.Now.Ticks - response.TimeStamp.Ticks) / TimeSpan.TicksPerSecond);
            int secondsLived = (int)(DateTime.Now.Subtract(response.TimeStamp).TotalSeconds % Int32.MaxValue);

            //logger.LogDebug("Seconds lived=" + secondsLived + ".");
            foreach (RR rr in response.RecordsRR)
            {
                if (rr.Type == DnsType.OPT)
                {
                    continue;
                }

                rr.TimeLived = TimeLived;
                // The TTL property calculates its actual time to live
                if (secondsLived > MIN_CACHE_SECONDS && secondsLived >= rr.TTL)
                {
                    logger.LogDebug($"DNS cache out of date result found for {strKey}. SecondsLived({secondsLived}) is >= remaining TimeToLive({rr.TTL})");
                    return(null); // out of date
                }
                if (rr.TTL == 0)
                {
                    logger.LogDebug("DNS cache out of date (TTL==0) result found for " + strKey + ".");
                    return(null); // out of date
                }
            }

            logger.LogDebug("DNS cache curent result found for " + strKey + ".");
            return(response);
        }