/// <summary> /// Adds dns records to cache. If old entry exists, it is replaced. /// </summary> /// <param name="qname"></param> /// <param name="qtype"></param> /// <param name="answers"></param> public static void AddToCache(string qname, int qtype, DnsServerResponse answers) { if (answers == null) { return; } try{ lock (m_pCache){ // Remove old cache entry, if any. if (m_pCache.Contains(qname + qtype)) { m_pCache.Remove(qname + qtype); } m_pCache.Add(qname + qtype, new DnsCacheEntry(answers, DateTime.Now)); } } catch { } }
/// <summary> /// Resolves a DNS host name or IP to IPAddress[]. /// </summary> /// <param name="hostName_IP">Host name or IP address.</param> /// <returns></returns> public static IPAddress[] Resolve(string hostName_IP) { // If hostName_IP is IP try{ return(new IPAddress[] { IPAddress.Parse(hostName_IP) }); } catch { } // This is probably NetBios name if (hostName_IP.IndexOf(".") == -1) { return(System.Net.Dns.Resolve(hostName_IP).AddressList); } else { // hostName_IP must be host name, try to resolve it's IP Dns_Client dns = new Dns_Client(); DnsServerResponse resp = dns.Query(hostName_IP, QTYPE.A); if (resp.ResponseCode == RCODE.NO_ERROR) { A_Record[] records = resp.GetARecords(); IPAddress[] retVal = new IPAddress[records.Length]; for (int i = 0; i < records.Length; i++) { retVal[i] = IPAddress.Parse(records[i].IP); } return(retVal); } else { throw new Exception(resp.ResponseCode.ToString()); } } }
/// <summary> /// Sends query to server. /// </summary> /// <param name="qname">Query text.</param> /// <param name="qtype">Query type.</param> /// <param name="qclass">Query class.</param> /// <returns></returns> private DnsServerResponse QueryServer(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); int helper = 0; for (int i = 0; i < (m_DnsServers.Length * 2); i++) { if (helper >= m_DnsServers.Length) { helper = 0; } try{ Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); udpClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 10000); udpClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 10000); udpClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, 1); udpClient.Connect(new IPEndPoint(IPAddress.Parse(m_DnsServers[helper]), 53)); //send query udpClient.Send(query); byte[] retVal = new byte[512]; int countRecieved = udpClient.Receive(retVal); udpClient.Close(); // If reply is ok, return it DnsServerResponse serverResponse = ParseQuery(retVal, queryID); // Cache query if (m_UseDnsCache && serverResponse.ResponseCode == RCODE.NO_ERROR) { DnsCache.AddToCache(qname, (int)qtype, serverResponse); } return(serverResponse); } catch { } helper++; } // If we reach so far, we probably won't get connection to dsn server return(new DnsServerResponse(false, RCODE.SERVER_FAILURE, null, null, null)); }
/// <summary> /// Default constructor. /// </summary> /// <param name="answers">Dns answers.</param> /// <param name="addTime">Entry add time.</param> public DnsCacheEntry(DnsServerResponse answers, DateTime addTime) { m_pResponse = answers; m_Time = addTime; }
/// <summary> /// Default constructor. /// </summary> /// <param name="answers">Dns answers.</param> /// <param name="addTime">Entry add time.</param> public DnsCacheEntry(DnsServerResponse answers,DateTime addTime) { m_pResponse = answers; m_Time = addTime; }
/// <summary> /// Adds dns records to cache. If old entry exists, it is replaced. /// </summary> /// <param name="qname"></param> /// <param name="qtype"></param> /// <param name="answers"></param> public static void AddToCache(string qname,int qtype,DnsServerResponse answers) { if(answers == null){ return; } try{ lock(m_pCache){ // Remove old cache entry, if any. if(m_pCache.Contains(qname + qtype)){ m_pCache.Remove(qname + qtype); } m_pCache.Add(qname + qtype,new DnsCacheEntry(answers,DateTime.Now)); } } catch{ } }