指定DNS服务器、本地UDP端口号获取域名IP地址组件

public class DNS
    
{
        
enum QueryType    //查询的资源记录类型。
        {
            A
=0x01,        //指定计算机 IP 地址。
            NS=0x02,    //指定用于命名区域的 DNS 名称服务器。
            MD=0x03,    //指定邮件接收站(此类型已经过时了,使用MX代替)。
            MF=0x04,    //指定邮件中转站(此类型已经过时了,使用MX代替)。
            CNAME=0x05,    //指定用于别名的规范名称。
            SOA=0x06,    //指定用于 DNS 区域的“起始授权机构”。
            MB=0x07,    //指定邮箱域名。
            MG=0x08,    //指定邮件组成员。
            MR=0x09,    //指定邮件重命名域名。
            NULL=0x0A,    //指定空的资源记录
            WKS=0x0B,    //描述已知服务。
            PTR=0x0C,    //如果查询是 IP 地址,则指定计算机名;否则指定指向其它信息的指针。
            HINFO=0x0D,    //指定计算机 CPU 以及操作系统类型。
            MINFO=0x0E,    //指定邮箱或邮件列表信息。
            MX=0x0F,    //指定邮件交换器。
            TXT=0x10,    //指定文本信息。
            UINFO=0x64,    //指定用户信息。
            UID=0x65,    //指定用户标识符。
            GID=0x66,    //指定组名的组标识符。
            ANY=0xFF    //指定所有数据类型。
        }
;
        
enum QueryClass    //指定信息的协议组。
        {
            IN
=0x01,    //指定 Internet 类别。
            CSNET=0x02,    //指定 CSNET 类别。(已过时)
            CHAOS=0x03,    //指定 Chaos 类别。
            HESIOD=0x04,//指定 MIT Athena Hesiod 类别。
            ANY=0xFF    //指定任何以前列出的通配符。
        }
;
        
struct ARecord
        
{
            
public string domain;    //查询的域名
            public QueryType queryType;    //查询类型
            public QueryClass queryClass;    //查询类
            public TimeSpan liveTime;    //生存时间
            public int dataLength;    //资源部分的长度,即指示邮件服务器的优先级及名称的那部分资源的字节数。
            public int preference;    //优先级值,其值越小越优先.
            public string IP;    //查询的域名的IP地址
        }


        
public string[] DnsResolve(string hostName,string DnsServerIP,int MyPort)
        
{
            
string[] IPs;
            DnsQueryIP DnsSearch
=new DnsQueryIP ();
            ARecord[] results
=DnsSearch.AQuery (hostName,DnsServerIP,MyPort);
            
if (results==nullreturn null;
            
int Sum=0;
            
for (int i=0;i<results.Length ;i++)
            
{
                
if (results[i].queryType ==QueryType.A )
                
{
                    Sum
++;
                }

            }

            IPs
=new string [Sum];
            Sum
=0;
            
for (int i=0;i<results.Length ;i++)
            
{
                
if (results[i].queryType ==QueryType.A )
                
{
                    IPs[Sum]
=results[i].IP ;
                    Sum
++;
                }

            }

            
return IPs;
        }


        
/// <summary>
        
/// DNS查询 A
        
/// </summary>

        sealed class DnsQueryIP
        
{
            
const int dnsPort = 53;
            
const int MAX_SENDBUFFER_SIZE = 100;
    
            
/// <summary>
            
/// 生成随机ID
            
/// </summary>
            
/// <param name="size">长成的长度</param>
            
/// <returns>size长度的ID字节数组</returns>

            private byte[] GetRndID(int size)
            
{
                
//不能使用Random类,因为此类在一秒内生成的序列是相同的。
                System.Security.Cryptography.RNGCryptoServiceProvider rnd=new System.Security.Cryptography.RNGCryptoServiceProvider();
                
byte[] data = new byte[size];
                rnd.GetNonZeroBytes(data);
                
return data;
            }




            UdpClient udp;
            
byte[] receiveBuffer;
            IPEndPoint remotePoint;
            
查询A记录
        }


    }
     组件使用,如果我们想使用澳门的DNS查询百度的IP地址,而且使用本地的1234UDP端口连接:
     private void button1_Click(object sender, System.EventArgs e)
  {
   DNS a=new DNS ();
   string[] b=a.DnsResolve ("www.baidu.com", "202.175.3.8", 1234);
   if (b.Length >0) System.Windows .Forms .MessageBox .Show (b[0]);
  }
    本组件可使用在指定了网关,而没有指定DNS的电脑上。在某些需要考虑安全的情况下,电脑上不设置DNS安全性将更高。由于可指定本地UDP端口,防火墙设置可更为精确,安全性也将更高。
    本组件中小部分代码来源为开源软件《音速邮》。
posted on 2006-04-19 14:09  爱好  阅读(3414)  评论(0)    收藏  举报