private static void ProcessLookups()
{
string hostname = null;
try
{
string threadName = Thread.CurrentThread.Name;
//logger.Debug("DNS Lookup Thread " + threadName + " started.");
while (!m_close)
{
int lookups = 0;
while (m_queuedLookups.Count > 0 && !m_close)
{
LookupRequest lookupRequest = LookupRequest.Empty;
string queryType = null;
//string hostname = null;
DNSResponse dnsResponse = null;
DateTime startLookupTime = DateTime.Now;
try
{
lock (m_queuedLookups)
{
if (m_queuedLookups.Count > 0)
{
lookupRequest = m_queuedLookups.Dequeue();
hostname = lookupRequest.Hostname;
queryType = lookupRequest.QueryType.ToString();
}
else
{
// Another thread got in ahead of this one to do the lookup.
continue;
}
}
lookups++;
logger.Debug("DNSManager thread " + threadName + " looking up " + queryType + " " + lookupRequest.Hostname + ".");
//dnsEntry = new DNSEntry(hostname);
//dnsEntry.LastLookup = DateTime.Now;
//IPHostEntry ipHostEntry = Dns.GetHostEntry(hostname);
if (lookupRequest.DNSServers == null)
{
dnsResponse = m_resolver.Query(lookupRequest.Hostname, lookupRequest.QueryType, lookupRequest.Timeout);
}
else
{
dnsResponse = m_resolver.Query(lookupRequest.Hostname, lookupRequest.QueryType, lookupRequest.Timeout, lookupRequest.DNSServers);
}
if (dnsResponse == null)
{
logger.Warn("DNSManager resolution error for " + lookupRequest.QueryType + " " + lookupRequest.Hostname + " no response was returned. Time taken=" + DateTime.Now.Subtract(startLookupTime).TotalMilliseconds + "ms.");
}
else if (dnsResponse.Error != null)
{
logger.Warn("DNSManager resolution error for " + lookupRequest.QueryType + " " + lookupRequest.Hostname + ". " + dnsResponse.Error + ". Time taken=" + DateTime.Now.Subtract(startLookupTime).TotalMilliseconds + "ms.");
}
else if (lookupRequest.QueryType == DNSQType.A)
{
if (dnsResponse.RecordsA != null && dnsResponse.RecordsA.Length > 0)
{
logger.Debug("DNSManager resolved A record for " + lookupRequest.Hostname + " to " + dnsResponse.RecordsA[0].Address.ToString() + " in " + DateTime.Now.Subtract(startLookupTime).TotalMilliseconds + "ms.");
}
else
{
logger.Warn("DNSManager could not resolve A record for " + lookupRequest.Hostname + " in " + DateTime.Now.Subtract(startLookupTime).TotalMilliseconds + "ms.");
}
}
else if (lookupRequest.QueryType == DNSQType.SRV)
{
logger.Debug("DNSManager resolve time for " + lookupRequest.Hostname + " " + lookupRequest.QueryType + " " + DateTime.Now.Subtract(startLookupTime).TotalMilliseconds + "ms.");
if (dnsResponse.RecordsRR == null || dnsResponse.RecordsRR.Length == 0)
{
logger.Debug(" no SRV resource records found for " + lookupRequest.Hostname + ".");
}
else
{
foreach (RecordSRV srvRecord in dnsResponse.RecordSRV)
{
logger.Debug(" result: priority=" + srvRecord.Priority + ", weight=" + srvRecord.Weight + ", port=" + srvRecord.Port + ", target=" + srvRecord.Target + ".");
}
}
}
else
{
logger.Debug("DNSManager resolve time for " + lookupRequest.Hostname + " " + lookupRequest.QueryType + " " + DateTime.Now.Subtract(startLookupTime).TotalMilliseconds + "ms.");
}
}
catch (Exception lookupExcp)
{
//dnsEntry.Unresolvable = true;
dnsResponse.Error = "Exception lookup. " + lookupExcp.Message;
logger.Error("Exception DNSManager ProcessLookups Lookup (thread, " + threadName + ", hostname=" + hostname + "). " + lookupExcp.GetType().ToString() + "-" + lookupExcp.Message);
}
finally
{
try
{
if (dnsResponse != null)
{
if (lookupRequest.CompleteEvent != null)
{
lookupRequest.CompleteEvent.Set();
}
// Mark any requests for the same hostname complete and fire the completed lookup event where required.
if (lookupRequest.Duplicates != null)
{
foreach (LookupRequest duplicateRequest in lookupRequest.Duplicates)
{
duplicateRequest.CompleteEvent.Set();
}
}
}
lock (m_inProgressLookups)
{
m_inProgressLookups.Remove(lookupRequest);
}
}
catch (Exception excp)
{
logger.Error("Exception DNSManager ProcessLookup Adding DNS Response. " + excp.Message);
}
}
}
// No more lookups outstanding, put thread to sleep until a new lookup is required.
m_lookupARE.WaitOne();
}
//logger.Debug("Thread " + threadName + " shutdown.");
}
catch (Exception excp)
{
logger.Error("Exception DNSManager ProcessLookups. " + excp.Message);
}
finally
{
if (m_close)
{
m_lookupARE.Set();
}
logger.Debug("DNSManager thread shutdown.");
}
}