Example #1
0
        /// <summary>
        /// Get IPHostEntry for given domainName.
        /// </summary>
        /// <param name="domainName">domainName</param>
        /// <param name="queryType">QueryType.Address or QueryType.MailExchange</param>
        /// <param name="dnsServer">dnsServer</param>
        /// <returns></returns>
        public static IPHostEntry GetIPHostEntry(string domainName, QueryType queryType, IPAddress dnsServer)
        {
            DnsMessage message = DnsMessage.StandardQuery();
            DnsQuery   query   = new DnsQuery(domainName, queryType);

            message.Querys.Add(query);
            byte[] msgData = DnsMessageCoder.EncodeDnsMessage(message);
            try
            {
                byte[] reply = QueryServer(msgData, dnsServer);
                if (reply != null)
                {
                    DnsMessage answer = DnsMessageCoder.DecodeDnsMessage(reply);
                    if (answer.ID == message.ID)
                    {
                        if (answer.Answers.Count > 0)
                        {
                            IPHostEntry host = new IPHostEntry();
                            host.HostName = domainName;
                            if (queryType == QueryType.Address)
                            {
                                host.AddressList = GetAddressList(domainName, answer);
                            }
                            else if (queryType == QueryType.MailExchange)
                            {
                                host.Aliases     = GetMailExchangeAliases(domainName, answer);
                                host.AddressList = GetAddressList(answer, new List <string>(host.Aliases));
                            }
                            return(host);
                        }
                        else if (answer.AuthorityRecords.Count > 0)
                        {
                            IPAddress[] serverAddresses = GetAuthorityServers(answer);
                            // depth first search
                            foreach (IPAddress serverIP in serverAddresses)
                            {
                                IPHostEntry host = GetIPHostEntry(domainName, queryType, serverIP);
                                if (host != null)
                                {
                                    return(host);
                                }
                            }
                        }
                    }
                }
            }
            catch { }
            return(null);
        }