使用C#做MX记录查询

  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Runtime.InteropServices;
  5.  
  6. //How to use
  7. //string[] s= MXSearch.GetMXRecords("eit.name");
  8. //foreach (string st in s)
  9. //Console.WriteLine("Server: {0}",st);
  10.  
  11.  
  12. namespace Eit.Name.Bcomcn
  13. {
  14.     class MXSearch
  15.     {
  16.         public MXSearch()
  17.         {
  18.         }
  19.  
  20.         #region importDll
  21.  
  22.         [DllImport("dnsapi", EntryPoint = "DnsQuery_W", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
  23.         private static extern int DnsQuery([MarshalAs(UnmanagedType.VBByRefStr)]ref string pszName, QueryTypes wType, QueryOptions options, int aipServers, ref IntPtr ppQueryResults, int pReserved);
  24.  
  25.         [DllImport("dnsapi", CharSet = CharSet.Auto, SetLastError = true)]
  26.         private static extern void DnsRecordListFree(IntPtr pRecordList, int FreeType);
  27.  
  28.         #endregion
  29.  
  30.  
  31.         public static string[] GetMXRecords(string domain)
  32.         {
  33.  
  34.             IntPtr ptr1 = IntPtr.Zero;
  35.             IntPtr ptr2 = IntPtr.Zero;
  36.             MXRecord recMx;
  37.             if (Environment.OSVersion.Platform != PlatformID.Win32NT)
  38.             {
  39.                 throw new NotSupportedException();
  40.             }
  41.             ArrayList list1 = new ArrayList();
  42.             int num1 = MXSearch.DnsQuery(ref domain, QueryTypes.DNS_TYPE_MX, QueryOptions.DNS_QUERY_BYPASS_CACHE, 0, ref ptr1, 0);
  43.             if (num1 != 0)
  44.             {
  45.                 throw new Win32Exception(num1);
  46.             }
  47.             for (ptr2 = ptr1; !ptr2.Equals(IntPtr.Zero); ptr2 = recMx.pNext)
  48.             {
  49.                 recMx = (MXRecord)Marshal.PtrToStructure(ptr2, typeof(MXRecord));
  50.                 if (recMx.wType == 15)
  51.                 {
  52.                     string text1 = Marshal.PtrToStringAuto(recMx.pNameExchange);
  53.                     list1.Add(text1);
  54.                 }
  55.             }
  56.             MXSearch.DnsRecordListFree(ptr2, 0);
  57.             return (string[])list1.ToArray(typeof(string));
  58.         }
  59.  
  60.         private enum QueryOptions
  61.         {
  62.             DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE = 1,
  63.             DNS_QUERY_BYPASS_CACHE = 8,
  64.             DNS_QUERY_DONT_RESET_TTL_VALUES = 0x100000,
  65.             DNS_QUERY_NO_HOSTS_FILE = 0x40,
  66.             DNS_QUERY_NO_LOCAL_NAME = 0x20,
  67.             DNS_QUERY_NO_NETBT = 0x80,
  68.             DNS_QUERY_NO_RECURSION = 4,
  69.             DNS_QUERY_NO_WIRE_QUERY = 0x10,
  70.             DNS_QUERY_RESERVED = -16777216,
  71.             DNS_QUERY_RETURN_MESSAGE = 0x200,
  72.             DNS_QUERY_STANDARD = 0,
  73.             DNS_QUERY_TREAT_AS_FQDN = 0x1000,
  74.             DNS_QUERY_USE_TCP_ONLY = 2,
  75.             DNS_QUERY_WIRE_ONLY = 0x100
  76.         }
  77.  
  78.         private enum QueryTypes
  79.         {
  80.             DNS_TYPE_MX = 15
  81.         }
  82.  
  83.         [StructLayout(LayoutKind.Sequential)]
  84.         private struct MXRecord
  85.         {
  86.             public IntPtr pNext;
  87.             public string pName;
  88.             public short wType;
  89.             public short wDataLength;
  90.             public int flags;
  91.             public int dwTtl;
  92.             public int dwReserved;
  93.             public IntPtr pNameExchange;
  94.             public short wPreference;
  95.             public short Pad;
  96.         }
  97.  
  98.  
  99.     }
  100. }


本文固定链接: http://www.ntxz.net/?p=1266 | 周忞 | 吉心的记事本



该日志由 吉心 于2010年08月26日发表在 C#, 网络摘编 分类下, 你可以发表评论
在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 使用C#做MX记录查询 | 周忞 | 吉心的记事本
关键字: , ,

使用C#做MX记录查询:目前有1 条留言

  1. 沙发
    e团:

    C#我也刚开始学,路还很长。。。

    2010-10-09 09:35

发表评论

您必须 [ 登录 ] 才能发表留言!