private byte[] GetQuery(byte[] query, int queryID) { byte[] retVal = null; try { var helper = 0; var count = 0; while (count < 10) { if (count > m_DnsServers.Length) { helper = 0; } byte[] reply = QueryServer(query, m_DnsServers[helper]); Dns_Answers answers = new Dns_Answers(); // If reply is ok, return it if (reply != null && answers.ParseAnswers(reply, queryID)) { return(reply); } count++; helper++; } } catch { } return(retVal); }
/// <summary> /// Gets MX records.(MX records are sorted by preference, lower array element is prefered) /// </summary> /// <param name="domain"></param> /// <param name="mxRecords"></param> /// <returns></returns> public DnsReplyCode GetMXRecords(string domain, out MX_Record[] mxRecords) { mxRecords = new MX_Record[0]; //--- Try to get MX records from cache if (m_UseDnsCache) { mxRecords = DnsCache.GetMXFromCache(domain); if (mxRecords != null) { // Console.WriteLine("domain:" + domain + " from cahce."); return(DnsReplyCode.Ok); } } //------------------------------------// Dns_Header header = new Dns_Header(DnsEx.ID, OPCODE.IQUERY); Dns_Query query = new Dns_Query(domain, QTYPE.MX, 1); byte[] bQuery = query.GetQuery(header); byte[] reply = GetQuery(bQuery, header.ID); if (reply != null) { Dns_Answers answers = new Dns_Answers(); if (answers.ParseAnswers(reply, header.ID)) { mxRecords = answers.GetMxRecordsFromAnswers(); if (mxRecords != null) { // Add to cache DnsCache.AddMXToCache(domain, mxRecords); return(DnsReplyCode.Ok); } else { return(DnsReplyCode.NoEntries); } } } return(DnsReplyCode.TempError); }