C#实现一个Whois的查询

nl whois.domain-registry.nl
eu whois.eu
edu whois.educause.net
net whois.crsnic.net
com whois.crsnic.net
org whois.crsnic.net
info whois.afilias.com
de whois.denic.de
cn whois.cnnic.net.cn
这些是我收集的whois服务器

比如你要查询的域名 是www.111cn.net 它是属于 .net后缀的,这个时候你就要去 whois.crnic.net这边来查询了。

 

接下来我们来看具体的实现代码。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace Qianfa.Utility
{
    /// <summary>
    /// <author>binbin</author>
    /// </summary>
    public class Whois
    {
        /// <summary>
        /// diabled to new instance
        /// </summary>
        private Whois()
        {
           
        }

        /// <summary>
        /// Clear cache
        /// </summary>
        public static void ClearCache()
        {
            lock (_lock)
            {
                _instance = null;
            }
        }

        private static Whois _instance =null;
        private static object _lock = new object();
        public static Whois Create(string path)
        {           
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new Whois();
      
                        _instance.serverList = new Dictionary<string, string>();
                        StreamReader sr = new StreamReader(path);

                        while (sr.Peek() != -1)
                        {
                            string line = sr.ReadLine();
                            string[] temp = line.Split(new char[] { 't', ' ' });
                            _instance.serverList.Add(temp[0].ToLower(), temp[1]);
                        }
                    }
                }
            }
           
            return _instance;
        }

        public Dictionary<string, string> serverList;
   
    /// <summary>
    /// .pro','.name', and '.tv' domains require an account for a whois
    /// </summary>
    /// <param name="domain"></param>
    /// <returns></returns>
        public string LookUp(string domain)
        {
            string result = "";
            string[] temp = domain.Split('.');
            string suffix = temp[temp.Length - 1].ToLower();// get the last;
            if (!serverList.Keys.Contains(suffix))
            {
                result= string.Format(Resources.Whois.NoSupport,suffix);
                return result;
            }
            string server = serverList[suffix];
     
            TcpClient client = new TcpClient();
            NetworkStream ns;
            try
            {
                client.Connect(server, 43);
                ns = client.GetStream();
                byte[] buffer = Encoding.ASCII.GetBytes(domain + "rn");
                ns.Write(buffer, 0, buffer.Length);

                buffer = new byte[8192];

                int i = ns.Read(buffer, 0, buffer.Length);
                while (i > 0)
                {
                    Encoding encoding = Encoding.UTF8;
                    //if (suffix == "cn")
                    //{
                    //    encoding = Encoding.UTF8;
                    //}
                    //else
                    //{
                    //    encoding = ASCIIEncoding.ASCII;
                    //}
                    result += encoding.GetString(buffer, 0, i);
                    i = ns.Read(buffer, 0, buffer.Length);
                }
            }
            catch(SocketException)
            {
                result = Resources.Whois.SocketError;
                return result;
            }
            ns.Close();
            client.Close();
           
            return result;
        }
    }
}

 我是把whois的服务器的文件放在一个文本文件里面 放在了

App_DataWhoisServer.txt这里面了。 这样在这个Whois类实例化的时候。就会自动去加载这些内容了。
关键的部分就是 Lookup方法了 Lookup允许传入的是域名,然后我们会去判断它是哪一个后缀,然后得到它是用哪一个server。接下来我们用
TcpClient去连接哪个server的43端口。把字符串变成字节流,发送到服务器,不断的读取服务器发送过来的内容 等到什么也读不到的时候就完成了这次查询,(这种是同步模式),然后把字节流变成字符串,就完成了这一个查询了。
 
看一下Demo是什么用它的。

新建一个WebForm page 在页面里面放一个 label控件取名为 lblResult。
哪么这个页面你就可以在浏览器里输入 http://yourserver:port/DomainWhois.asp教程x?domain=zhenqiu.net.
我在实际项目中用到的地址是

 

http://www.starteenwinkel.nl/domainwhois.aspx?domain=zhenqiu.net

 

public partial class DomainWhois : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string domain = Request.QueryString["Domain"];

        if (!string.IsNullOrEmpty(domain))
        {
            Whois whois = Whois.Create(Server.MapPath("~/App_Data/WhoisServer.txt"));
            lblResult.Text = whois.LookUp(domain).Replace("rn","<br />").Replace("n","<br />");
        }
    }
}

时间: 2024-10-30 20:32:44

C#实现一个Whois的查询的相关文章

mysql-求一个Mysql语句 查询出当前周的数据按照天分组

问题描述 求一个Mysql语句 查询出当前周的数据按照天分组 SELECT DATE_FORMAT(uploadTime_beg%Y-%m-%d"") as time SUM(field01) as sumStatus1 SUM(field02) as sumStatus2 SUM(field03) as sumStatus3 SUM(field04) as sumStatus4 SUM(field05) as sumStatus5 FROM health_realdata WHERE

Ultradev实例教程:3.7 创建一个简单的查询

创建|教程 第三章:应用数据库创建动态网页 第七节:创建一个简单的查询 其实查询创建的原理与我们在上面学到的数据编辑原理是一样的,都是先从第一个页面传递一个值给第二个页面,然后第二个页面根据这个传递过去的值取出相应的纪录,再做以相应的处理,如显示.编辑.删除.所不同的是传递方式.上一节我们是通过地址连接来传递值,而我们知道一般查询都是通过一个表单填写数据然后提交的. 好,就让我们来看看具体的创建过程. 首先我们要创建一个用户能够输入查询内容的页面.如图,我们插入一个名为Search的类型为Tex

使用javascript实现一个高级组合查询控件(内含初步实现原型)

在很多项目中,特别是信息系统,查询功能占了项目的大部分:同时查询条件的组合要求丰富,因此实现起来变得复杂.一般情况下,我们只会实现有限的条件查询,如一个表的某几个重要的字段或者甚至所有的字段:当然,常规的情况下客户是足够用的,但一些高级的应用,如((字段1>10) or (字段2=5)) and 字段3 is not null) 这种复杂的条件组合,就不一定适合了,通常如果是固定几种组合模式,这样我们还可以在后台用语言(java.c#等)实现,要是条件组合是动态的,那么实现起来就相当麻烦了. 因

标识符-一个关于子查询的问题求解决!

问题描述 一个关于子查询的问题求解决! SELECT CASE ????????? WHEN T1.A = T2.A THEN ?????????? (SELECT T3.A FROM (SELECT 1 AS A FROM DUAL) T3 WHERE T2.A = T3.A) ????????? ELSE ?????????? 0 ??????? END AS TEST ?? FROM (SELECT 1 AS A FROM DUAL) T1, (SELECT 1 AS A FROM DUA

hibernate可不可以根据一个实体类查询出数据库中是否存在该记录

问题描述 hibernate可不可以根据一个实体类查询出数据库中是否存在该记录 需要判断一条记录是否已经在数据库中是否存在重复记录,用hql的话传入的参数会比较多

ip地址-关于whois数据库查询的问题

问题描述 关于whois数据库查询的问题 1)想要查询whois数据库,是通过 什么参数 进行查询 的呢?是通过 域名对应的IP地址 查询么? 2)whois数据库查询的结果是什么呢?是关于 域名的一些信息 么? 解决方案 根据注册的域名来查询 返回相关域名的各种信息 域名:baidu.com 访问此网站 该数据缓存于 2015-03-21 12:46,点击 强制更新 注册商:MARKMONITOR INC. 域名服务器:whois.markmonitor.com DNS服务器:DNS.BAID

sql语句-表T(A)包含正整数,可能有重复,构造一个SQL语句查询不在表T中的最小正整数

问题描述 表T(A)包含正整数,可能有重复,构造一个SQL语句查询不在表T中的最小正整数 表T(A)包含正整数,可能有重复,构造一个SQL语句查询不在表T中的最小正整数,需要考虑表T包含或不包含正整数1两种情况.不能编程实现.考虑了半天没有很好的思路,请大家指点则个 解决方案 DECLARE @minvalue INT = select min(A) from T IF minvalue > 1 return 1 ELSE DECLARE @maxvalue INT = select max(A

拟定一个场景,需要做多条件查询,假设先选择一个条件,查询出内容后

问题描述 拟定一个场景,需要做多条件查询,假设先选择一个条件,查询出内容后 再选择一个条件,如何保证第二次查询是在第一次查询的基础上.用的ss2h框架 解决方案 不明白,你说的这个 可以在第二次查询的时候把第一次查询的条件参数带上,联查就可以额

vb.net连接sql数据库查询表格名显示到 DataGridView中,如何点击选择一个表名查询整个表的内容

问题描述 我的代码如下,怎么解决这个问题啊,想了很久.button1是查询表名,button2是查询选中的表内容PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimstrConnectionAsString="Server=DELL-PCSQLEXPRESS;database=renshi;uid=ouqing;pwd=123;"Dimsql