/// <summary>
/// Sends query to server.
/// </summary>
/// <param name="timeout">Query timeout in milli seconds.</param>
/// <param name="qname">Query text.</param>
/// <param name="qtype">Query type.</param>
/// <param name="qclass">Query class.</param>
/// <returns>Returns DNS server response.</returns>
private DnsServerResponse QueryServer(int timeout, string qname, QTYPE qtype, int qclass)
{
if (m_DnsServers == null || m_DnsServers.Length == 0)
{
throw new Exception("Dns server isn't specified !");
}
// See if query is in cache
if (m_UseDnsCache)
{
DnsServerResponse resopnse = DnsCache.GetFromCache(qname, (int)qtype);
if (resopnse != null)
{
return(resopnse);
}
}
int queryID = Dns_Client.ID;
byte[] query = CreateQuery(queryID, qname, qtype, qclass);
// Create transcation and start processing it.
using (DnsTransaction transaction = new DnsTransaction(this, queryID, qname, (int)qtype, timeout, query)){
ManualResetEvent wait = new ManualResetEvent(false);
transaction.Timeout += delegate(object s, EventArgs e){
wait.Set();
};
transaction.Completed += delegate(object s, EventArgs e){
wait.Set();
};
m_pTransactions.Add(transaction.ID, transaction);
// Start transaction processing and wait transaction to complete.
transaction.Start();
wait.WaitOne();
// DNS server response received.
if (transaction.Response != null)
{
return(transaction.Response);
}
// No server response - timeout.
else
{
throw new Exception("Timeout - no response from DNS server.");
}
}
}