コード例 #1
0
        /// <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 {
            }
        }
コード例 #2
0
        /// <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());
                }
            }
        }
コード例 #3
0
        /// <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));
        }
コード例 #4
0
 /// <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;
 }
コード例 #5
0
		/// <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;
		}
コード例 #6
0
		/// <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{
			}
		}