3

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

4

6 回答 6

7

我在 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();
}
于 2009-07-01T06:37:04.757 回答
4

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

于 2008-09-10T08:33:32.990 回答
3

只有当您知道要连接到哪个“whois”服务器时,Thomas 的回答才有效。

有许多不同的方法可以找到它,但没有一个 (AFAIK) 对每个域注册机构都适用。

一些域名支持DNSSRV中的服务记录_nicname._tcp,但存在问题,因为目前还没有公认的标准来防止子域提供SRV覆盖官方注册表的记录(请参阅https://datatracker. ietf.org/doc/html/draft-sanz-whois-srv-00)。

对于许多 TLD,可以将您的查询发送到<tld>.whois-servers.net. 这实际上工作得很好,但要注意它不会在所有有官方授权的二级域的情况下都有效。

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

令人困惑的是.uk.com,数据库中还有“非官方”注册表,例如。whois-servers.net

ps WHOIS 中的官方行尾分隔符,与大多数 IETF 协议一样CRLF,不仅仅是LF.

于 2008-10-07T09:34:45.467 回答
2

我发现了一些提供此信息的网络服务。这个是免费的,对我来说效果很好。 http://www.webservicex.net/whois.asmx?op=GetWhoIS

于 2009-05-29T00:24:12.080 回答
2

我在这里找到了一个完美的 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());
            }
         }
      }
   }
}
于 2013-04-23T21:21:18.660 回答
-4

这是 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();
    }
}
于 2008-09-10T08:36:03.047 回答