指定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==null) return 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记录
}
}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端口,防火墙设置可更为精确,安全性也将更高。
本组件中小部分代码来源为开源软件《音速邮》。

浙公网安备 33010602011771号