最近在做爬虫的作业,今天学习的内容是关于DNS解析模块的制作的。使用的库为ARSoft.Tools.Net,它是一个非常强大的开源DNS控件库,包含.Net SPF validation, SenderID validation以及DNS Client、DNS Server接口。使用该接口可轻松实现DNS客户请求端及服务器解析端。
项目地址:http://arsofttoolsnet.codeplex.com/,
Nuget包地址:https://www.nuget.org/packages/ARSoft.Tools.Net/。
引入
首先引入nuget包:
Install-Package ARSoft.Tools.NetInstall-Package ARSoft.Tools.Net
具体实现
实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
public static IPAddress DnsResolver(string dnsServer, int timeOut, string url, out bool isSuccess) { var dnsClient = new DnsClient(IPAddress.Parse(dnsServer), timeOut); var s = new Stopwatch(); s.Start(); var dnsMessage = dnsClient.Resolve(DomainName.Parse(url)); s.Stop(); Console.WriteLine(s.Elapsed.Milliseconds); if (dnsMessage == null || (dnsMessage.ReturnCode != ReturnCode.NoError && dnsMessage.ReturnCode != ReturnCode.NxDomain)) { isSuccess= false; } if (dnsMessage != null) foreach (var dnsRecord in dnsMessage.AnswerRecords) { var aRecord = dnsRecord as ARecord; if (aRecord == null) continue; isSuccess = true; return aRecord.Address; } isSuccess= false; return null; }
|
调用代码
1 2 3 4
| bool isSuccess; IPAddress ip = DnsResolver("223.5.5.5", 200, "shaoweicloud.cn", out isSuccess); if (isSuccess) Console.WriteLine(ip);
|
进一步封装
懂的使用方法后我们可以对它做进一步封装,得到DnsResolver类:
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| using System; using System.Collections.Generic; using System.Diagnostics; using System.Net; using ARSoft.Tools.Net; using ARSoft.Tools.Net.Dns;
namespace Crawler.Protocol { public class DnsResolver { public TimeSpan TimeSpan { get; set; } public string Url { get; set; } public List Record { get; set; } public string DnsServer { get; set; } public int TimeOut { get; set; } public ReturnCode ReturnCode { get; set; } public bool IsSuccess { get; private set; } public DnsResolver(string url, string dnsServer = "223.5.5.5", int timeOut = 200) { Url = url; DnsServer = dnsServer; TimeOut = timeOut; Record=new List(); Dig(); }
public void Dig() { var dnsClient = new DnsClient(IPAddress.Parse(DnsServer), TimeOut); var s = new Stopwatch(); s.Start(); var dnsMessage = dnsClient.Resolve(DomainName.Parse(Url)); s.Stop(); TimeSpan = s.Elapsed; if (dnsMessage == null || (dnsMessage.ReturnCode != ReturnCode.NoError && dnsMessage.ReturnCode != ReturnCode.NxDomain)) IsSuccess = false; if (dnsMessage != null) foreach (var dnsRecord in dnsMessage.AnswerRecords) { var aRecord = dnsRecord as ARecord; if (aRecord == null) continue; IsSuccess = true; Record.Add(aRecord); } if (dnsMessage != null) ReturnCode = dnsMessage.ReturnCode; } } }
|
调用方法
1 2 3
| DnsResolver dns = new DnsResolver("shaoweicloud.cn"); if (dns.IsSuccess) Console.WriteLine(dns.Record[0]);
|
结束
至此,DNS解析模块就基本结束了,至于为什么标题中标注了半成品,是因为我想在基本的DNS解析功能的基础上根据解析到DNS信息中的TTL做一套信息缓存机制,减少不必要的重复查询,目前还在考虑使用何种方法,后续实现会更新。