C# 如何在我的程序中获取域名的whois信息?

C# 如何在我的程序中获取域名的whois信息?,c#,java,whois,domain-name,C#,Java,Whois,Domain Name,我想从我的c#/java程序中获取域名的whois信息。有没有一个简单的方法可以做到这一点 我认为,最简单的方法是在端口43上与whois服务器进行套接字连接。发送域名,后跟换行符并读取响应。以下是Java解决方案,它只需打开一个shell并运行whois: import java.io.*; import java.util.*; public class ExecTest2 { public static void main(String[] args) throws IOExce

我想从我的c#/java程序中获取域名的whois信息。有没有一个简单的方法可以做到这一点

我认为,最简单的方法是在端口43上与whois服务器进行套接字连接。发送域名,后跟换行符并读取响应。

以下是Java解决方案,它只需打开一个shell并运行
whois

import java.io.*;
import java.util.*;

public class ExecTest2 {
    public static void main(String[] args) throws IOException {
        Process result = Runtime.getRuntime().exec("whois stackoverflow.com");

        BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));
        StringBuffer outputSB = new StringBuffer(40000);
        String s = null;

        while ((s = output.readLine()) != null) {
            outputSB.append(s + "\n");
            System.out.println(s);
        }

        String whoisStr = output.toString();
    }
}

只有当您知道要连接到哪个“whois”服务器时,Thomas的答案才会起作用

有许多不同的方法可以找到答案,但没有一种(AFAIK)可以统一适用于每个域注册表

一些域名支持DNS中的
SRV
记录
\u nicname.\u tcp
服务,但这方面存在问题,因为还没有公认的标准来防止子域提供覆盖官方注册的
SRV
记录(请参阅)

对于许多TLD,可以将查询发送到
.whois servers.net
。这实际上非常有效,但要注意,它不会在所有有正式授权的二级域的情况下都有效

例如,在
.uk
中有几个官方子域,但其中只有一些子域由
.uk
注册表运行,其他子域拥有自己的WHOIS服务,而这些子域不在
WHOIS servers.net
数据库中

令人困惑的是,还有一些“非官方”注册,例如
.uk.com
,它们位于
whois servers.net
数据库中


p、 与大多数IETF协议一样,WHOIS中的官方行尾分隔符是
CRLF
,而不仅仅是
LF
,我发现一些web服务提供了这些信息。这个是免费的,对我来说很有用

我在dotnet-snippets.com(已经不存在了)上找到了一个完美的C#示例

直接复制并粘贴到您自己的应用程序中需要11行代码

/// <summary>
/// Gets the whois information.
/// </summary>
/// <param name="whoisServer">The whois server.</param>
/// <param name="url">The URL.</param>
/// <returns></returns>
private string GetWhoisInformation(string whoisServer, string url)
{
    StringBuilder stringBuilderResult = new StringBuilder();
    TcpClient tcpClinetWhois = new TcpClient(whoisServer, 43);
    NetworkStream networkStreamWhois = tcpClinetWhois.GetStream();
    BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois);
    StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois);

    streamWriter.WriteLine(url);
    streamWriter.Flush();

    StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois);

    while (!streamReaderReceive.EndOfStream)
        stringBuilderResult.AppendLine(streamReaderReceive.ReadLine());

    return stringBuilderResult.ToString();
}
//
///获取whois信息。
/// 
///whois服务器。
///URL。
/// 
私有字符串GetWhoisInformation(字符串whoisServer、字符串url)
{
StringBuilder stringBuilderResult=新建StringBuilder();
TcpClient tcpClinetWhois=新的TcpClient(whoisServer,43);
NetworkStream networkStreamWhois=tcpclinetwois.GetStream();
BufferedStream bufferedStreamWhois=新的BufferedStream(networkStreamWhois);
StreamWriter StreamWriter=新StreamWriter(bufferedStreamWhois);
streamWriter.WriteLine(url);
streamWriter.Flush();
StreamReader streamReaderReceive=新的StreamReader(bufferedStreamWhois);
而(!streamReaderReceive.EndOfStream)
stringBuilderResult.AppendLine(streamReaderReceive.ReadLine());
返回stringBuilderResult.ToString();
}
我在这里找到了一个完美的C#示例。直接复制并粘贴到您自己的应用程序中需要11行代码。但首先,您应该添加一些using语句,以确保正确调用dispose方法以防止内存泄漏:

StringBuilder stringBuilderResult = new StringBuilder();
using(TcpClient tcpClinetWhois = new TcpClient(whoIsServer, 43))
{
   using(NetworkStream networkStreamWhois = tcpClinetWhois.GetStream())
   {
      using(BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois))
      {
         using(StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois))
         {
            streamWriter.WriteLine(url);
            streamWriter.Flush();
            using (StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois))
            {
               while (!streamReaderReceive.EndOfStream) stringBuilderResult.AppendLine(streamReaderReceive.ReadLine());
            }
         }
      }
   }
}

谢谢你发布这个答案。我已经编辑了你的文章,修复了一些代码格式问题。你真的运行了代码吗?运行此代码时出现“无法访问封闭流”异常。如果我没有在StreamReader streamReaderReceive=new StreamReader(bufferedStreamWhois)之前放置using,我没有得到任何异常。看起来很有希望,但我得到:System.Net.Sockets.SocketException:请求的名称有效,但在whois.whois.GetWhoIS(字符串主机名)中找不到请求类型的数据(即使在信息页面本身的字段中输入ip地址)您需要确定首先使用哪个服务器。这里有一个这样的示例:这里有一个很好的示例:“所有请求都用ASCII CR终止,然后用ASCII LF终止。”2.协议规范添加,我必须使用System.Net.Sockets添加
;使用System.IO;
来完成代码…TcpClient、NetworkStream、BufferedStream,StreamWriter和StreamReader在使用后都需要处理。不要仅仅为了运行whois命令而掏腰包,这将产生源源不断的安全和性能问题。使用编程语言中的库来执行whois查询,或者由于协议非常简单,只需打开一个TCP套接字到端口43并发送que即可Y.有关详细信息,请参阅RFC3912。