public static DNSResponse Lookup(string hostname, DNSQType queryType, int timeout, List <IPEndPoint> dnsServers, bool useCache, bool async) { if (hostname == null || hostname.Trim().Length == 0) { return(null); } DNSResponse ipAddressResult = MatchIPAddress(hostname); if (ipAddressResult != null) { return(ipAddressResult); } else if (useCache) { DNSResponse cacheResult = m_resolver.QueryCache(hostname.Trim().ToLower(), queryType); if (cacheResult != null) { return(cacheResult); } } if (async) { //logger.Debug("DNS lookup cache miss for async lookup to " + queryType.ToString() + " " + hostname + "."); QueueLookup(new LookupRequest(hostname.Trim().ToLower(), queryType, timeout, dnsServers, null)); return(null); } else { ManualResetEvent completeEvent = new ManualResetEvent(false); QueueLookup(new LookupRequest(hostname.Trim().ToLower(), queryType, timeout, dnsServers, completeEvent)); if (completeEvent.WaitOne(timeout * 1000 * 2, false)) { //logger.Debug("Complete event fired for DNS lookup on " + queryType.ToString() + " " + hostname + "."); // Completed event was fired, the DNS entry will now be in cache. DNSResponse result = m_resolver.QueryCache(hostname, queryType); if (result != null) { return(result); } else { //logger.Debug("DNS lookup cache miss for " + queryType.ToString() + " " + hostname + "."); // Timeout. DNSResponse timeoutResponse = new DNSResponse(); timeoutResponse.Timedout = true; return(timeoutResponse); } } else { // If this block gets called it's because the DNS resolver class did not return within twice the timeout period it // was asked to do so in. If this happens a lot further investigation into the DNS resolver class is warranted. logger.Error("DNSManager timed out waiting for the DNS resolver to complete the lookup for " + queryType.ToString() + " " + hostname + "."); // Timeout. DNSResponse timeoutResponse = new DNSResponse(); timeoutResponse.Timedout = true; return(timeoutResponse); } } }
public static DNSResponse Lookup(string hostname, DNSQType queryType, int timeout, List<IPEndPoint> dnsServers, bool useCache, bool async) { if (hostname == null || hostname.Trim().Length == 0) { return null; } DNSResponse ipAddressResult = MatchIPAddress(hostname); if (ipAddressResult != null) { return ipAddressResult; } else if (useCache) { DNSResponse cacheResult = m_resolver.QueryCache(hostname.Trim().ToLower(), queryType); if (cacheResult != null) { return cacheResult; } } if (async) { //logger.Debug("DNS lookup cache miss for async lookup to " + queryType.ToString() + " " + hostname + "."); QueueLookup(new LookupRequest(hostname.Trim().ToLower(), queryType, timeout, dnsServers, null)); return null; } else { ManualResetEvent completeEvent = new ManualResetEvent(false); QueueLookup(new LookupRequest(hostname.Trim().ToLower(), queryType, timeout, dnsServers, completeEvent)); if (completeEvent.WaitOne(timeout * 1000 * 2, false)) { //logger.Debug("Complete event fired for DNS lookup on " + queryType.ToString() + " " + hostname + "."); // Completed event was fired, the DNS entry will now be in cache. DNSResponse result = m_resolver.QueryCache(hostname, queryType); if (result != null) { return result; } else { //logger.Debug("DNS lookup cache miss for " + queryType.ToString() + " " + hostname + "."); // Timeout. DNSResponse timeoutResponse = new DNSResponse(); timeoutResponse.Timedout = true; return timeoutResponse; } } else { // If this block gets called it's because the DNS resolver class did not return within twice the timeout period it // was asked to do so in. If this happens a lot further investigation into the DNS resolver class is warranted. logger.Error("DNSManager timed out waiting for the DNS resolver to complete the lookup for " + queryType.ToString() + " " + hostname + "."); // Timeout. DNSResponse timeoutResponse = new DNSResponse(); timeoutResponse.Timedout = true; return timeoutResponse; } } }
private void VerboseDNSLookup(string host, DNSQType queryType) { AppendTraceMessage("Looking up " + host + " query type " + queryType.ToString() + ".\n"); try { //DNSResponse dnsResponse = DNSManager.Lookup(host, queryType, 5, new List<IPEndPoint>{new IPEndPoint(IPAddress.Parse("128.59.16.20"), 53)}, false, false); DNSResponse dnsResponse = DNSManager.Lookup(host, queryType, 5, null, false, false); if (dnsResponse.Error == null) { List<AnswerRR> records = dnsResponse.Answers; //if (records.Count > 0) if (dnsResponse.RecordNAPTR.Length > 0) { AppendTraceMessage("Results for " + host + " query type " + queryType.ToString() + ".\n"); //foreach (AnswerRR record in records) foreach (RecordNAPTR record in dnsResponse.RecordNAPTR) { AppendTraceMessage(record.ToString() + "\n"); } } else { AppendTraceMessage("Empty result returned for " + host + " query type " + queryType.ToString() + ".\n"); } } else { AppendTraceMessage("DNS lookup error for " + host + " query type " + queryType.ToString() + ", " + dnsResponse.Error + ".\n"); } } catch (ApplicationException appExcp) { AppendTraceMessage(appExcp.Message); } }