[爬虫学习笔记]C#基于ARSoft.Tools.Net的DNS解析模块(半成品)

news/2024/7/19 10:15:21 标签: 运维, c#, 爬虫

      最近在做爬虫的作业,今天学习的内容是关于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.Net

 

 

下面开始具体实现:

/// <summary>
/// DNS解析
/// </summary>
/// <param name="dnsServer">DNS服务器IP</param>
/// <param name="timeOut">解析超时时间</param>
/// <param name="url">解析网址</param>
/// <param name="isSuccess">是否解析成功</param>
/// <returns>解析到的IP信息</returns>
public static IPAddress DnsResolver(string dnsServer, int timeOut, string url, out bool isSuccess)
{
    //初始化DnsClient,第一个参数为DNS服务器的IP,第二个参数为超时时间
    var dnsClient = new DnsClient(IPAddress.Parse(dnsServer), timeOut);
    //解析域名。将域名请求发送至DNS服务器解析,第一个参数为需要解析的域名,第二个参数为
    //解析类型, RecordType.A为IPV4类型
    //DnsMessage dnsMessage = dnsClient.Resolve("www.sina.com", RecordType.A);
    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;
    }
    //循环遍历返回结果,将返回的IPV4记录添加到结果集List中。
    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;
}

调用方法:

bool isSuccess;
IPAddress ip = DnsResolver("223.5.5.5", 200, "shaoweicloud.cn", out isSuccess);
if (isSuccess)
    Console.WriteLine(ip);

 

 

懂的使用方法后我们可以对它做进一步封装,得到DnsResolver类:

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()
        {
            //初始化DnsClient,第一个参数为DNS服务器的IP,第二个参数为超时时间
            var dnsClient = new DnsClient(IPAddress.Parse(DnsServer), TimeOut);
            var s = new Stopwatch();
            s.Start();
            //解析域名。将域名请求发送至DNS服务器解析,参数为需要解析的域名
            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;
            //循环遍历返回结果,将返回的IPV4记录添加到结果集List中。
            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;
        }
    }
}

调用方法:

DnsResolver dns = new DnsResolver("shaoweicloud.cn");
if (dns.IsSuccess)
    Console.WriteLine(dns.Record[0]);

 

         至此,DNS解析模块就基本结束了,至于为什么标题中标注了半成品,是因为我想在基本的DNS解析功能的基础上根据解析到DNS信息中的TTL做一套信息缓存机制,减少不必要的重复查询,目前还在考虑使用何种方法,后续实现会更新。

转载于:https://www.cnblogs.com/WayneShao/p/5860833.html


http://www.niftyadmin.cn/n/845868.html

相关文章

表空间配额和UNLIMITED TABLESPACE权限

原文地址&#xff1a;点击打开链接 对于一个新建的用户&#xff0c;如果没有分配给unlimited tablespace系统权限的用户&#xff0c;必须先给他们指定限额&#xff0c;之后他们才能在表空间中创建对象&#xff0c;限额可以是&#xff1a;A、以兆字节或者千字节为单位的特定值B、…

8、redis之事务1-redis命令

一、概述&#xff1a; 和众多其它数据库一样&#xff0c;Redis作为NoSQL数据库也同样提供了事务机制。在Redis中&#xff0c;MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石。相信对有关系型数据库开发经验的开发者而言这一概念并不陌生&#xff0c;即便如此&am…

pygame开发PC端微信打飞机游戏

2019独角兽企业重金招聘Python工程师标准>>> pygame开发PC端微信打飞机游戏 一、项目简介 1. 介绍本项目类似曾经火爆的微信打飞机游戏。游戏将使用Python语言开发&#xff0c;主要用到pygame的API。游戏最终将会以python源文件game.py形式完成&#xff0c;只需要运…

Linux 任务计划,周期性任务执行

Linux 任务计划、周期性任务执行概述&#xff1a;什么是任务计划呢&#xff1f;就像我们每个人日常生活中都会使用到的闹钟一样&#xff0c;按时的去提醒该去做什么事情&#xff0c;以免忘记。同样&#xff0c;我们在工作当中也要在每天在特定的时间内安排做一些事情&#xff0…

利用 squid 反向代理提高网站性能

2019独角兽企业重金招聘Python工程师标准>>> 本文在介绍 squid 反向代理的工作原理的基础上&#xff0c;指出反向代理技术在提高网站访问速度&#xff0c;增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下&#xff0c;利用 DNS 轮询和 Squid 反向代…

关于 58 996 浪潮 奋进者计划 华为 奋斗者协议—— 小论!

2016年9月12日11:40:09 其实我一般不再博客写这些关于个人或者公司的相关的东西&#xff0c;只写技术相关&#xff0c;但是就现在看到&#xff0c;觉得不吐出的心声&#xff0c;就得不快 首先了解一下58 996 浪潮 奋进者计划 华为 奋斗者协议相关东西 996工作制”是指工作日早…

【shell】grep使用正则表达式

要求如下&#xff1a; 有一些具有固定格式的数字, 如下:031-723-232812345678(234)-001-8932123-345-12345761234(234-777-1234复制代码 条件: 1.> 长度为7的数字 2.> 由 3,3,4 长度组成, 并由 - 字符进行分割的 3.> 第一组数字由一对小括号包围起来的, 但是必须成对出…

JAVA Calendar具体解释

&#xff08;在文章的最后&#xff0c;将会介绍Date类&#xff0c;假设有兴趣&#xff0c;能够直接翻到最后去阅读&#xff09; 到底什么是一个 Calendar 呢&#xff1f;中文的翻译就是日历&#xff0c;那我们立马能够想到我们生活中有阳(公)历、阴(农)历之分。它们的差别在哪呢…