/// <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); }
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; }
/// <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); }
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); }
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; }
/// <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); }
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; }
public void AddQuestion(Question question) { Questions.Add(question); }
public void AddQuestion(Question question) { questions.Add(question); }
/// <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)); }
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); }