• C#查询DNS的MX地址的代码


    //C#查询DNS的MX地址的代码
    namespace PAB.DnsUtils 
    {
     using System;
     using System.Collections;
     using System.ComponentModel;
     using System.Runtime.InteropServices;
     
     public class DnsMx
     {
      public DnsMx()
      {
      }
      
      [DllImport("dnsapi", EntryPoint="DnsQuery_W", CharSet=CharSet.Unicode, SetLastError=true, ExactSpelling=true)]
      private static extern int DnsQuery([MarshalAs(UnmanagedType.VBByRefStr)]ref string pszName, QueryTypes wType, QueryOptions options, int aipServers, ref IntPtr ppQueryResults, int pReserved);
      
      [DllImport("dnsapi", CharSet=CharSet.Auto, SetLastError=true)]
      private static extern void DnsRecordListFree(IntPtr pRecordList, int FreeType);
      
      public static string[] GetMXRecords(string domain) 
      { 
       IntPtr ptr1=IntPtr.Zero ;
       IntPtr ptr2=IntPtr.Zero ;
       MXRecord recMx;
       
       if (Environment.OSVersion.Platform != PlatformID.Win32NT)
       { 
        throw new NotSupportedException();
       } 
       
       ArrayList list1 = new ArrayList();
       
       int num1 = DnsMx.DnsQuery(ref domain, QueryTypes.DNS_TYPE_MX, QueryOptions.DNS_QUERY_BYPASS_CACHE, 0, ref ptr1, 0);
       
       if (num1 != 0) { throw new Win32Exception(num1); }
       
       for (ptr2 = ptr1; !ptr2.Equals(IntPtr.Zero); ptr2 = recMx.pNext)
       {
        recMx = ( MXRecord) Marshal.PtrToStructure(ptr2, typeof(MXRecord));
        
        if (recMx.wType == 15)
        { 
         string text1 = Marshal.PtrToStringAuto(recMx.pNameExchange);
         list1.Add(text1);
        }
       }
       
       DnsMx.DnsRecordListFree(ptr2, 0);
       
       return (string[]) list1.ToArray(typeof(string));
      }
      
      private enum QueryOptions { DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE = 1, DNS_QUERY_BYPASS_CACHE = 8, DNS_QUERY_DONT_RESET_TTL_VALUES = 0x100000, DNS_QUERY_NO_HOSTS_FILE = 0x40, DNS_QUERY_NO_LOCAL_NAME = 0x20, DNS_QUERY_NO_NETBT = 0x80, DNS_QUERY_NO_RECURSION = 4, DNS_QUERY_NO_WIRE_QUERY = 0x10, DNS_QUERY_RESERVED = -16777216, DNS_QUERY_RETURN_MESSAGE = 0x200, DNS_QUERY_STANDARD = 0, DNS_QUERY_TREAT_AS_FQDN = 0x1000, DNS_QUERY_USE_TCP_ONLY = 2, DNS_QUERY_WIRE_ONLY = 0x100 }
      
      private enum QueryTypes { DNS_TYPE_MX = 15 }
      
      [StructLayout(LayoutKind.Sequential)]
      private struct MXRecord 
      {
       public IntPtr pNext;
       public string pName;
       public short wType;
       public short wDataLength;
       public int flags;
       public int dwTtl;
       public int dwReserved;
       public IntPtr pNameExchange;
       public short wPreference;
       public short Pad;
      }
     } 
    }
    static void Main(string[] args) 
    {
     string[] s= PAB.DnsUtils.DnsMx.GetMXRecords("microsoft.com");
     
     foreach (string st in s) Console.WriteLine("Server: {0}",st);
     
     Console.ReadLine();
    }
    

      

  • 相关阅读:
    CLR via C# 3rd Edition下载
    SQL中的CASE WHEN语句
    为何要写注释?
    插件购票的公平性分析
    数据查询
    国产操作系统的市场运作策略
    0/0=2?
    为什么0.1无法被二进制小数精确表示?
    .net 可能要遭到取缔
    思考问题要先注意主体
  • 原文地址:https://www.cnblogs.com/chengulv/p/2807559.html
Copyright © 2020-2023  润新知