2008-09-10 48 views

回答

4

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

+0

您需要确定哪些* *域名服务器首先使用。这里有一个例子:这里有一个很好的例子:http://flipbit.co.uk/2009/06/querying-whois-server-data-with-c.html – 2014-06-17 13:05:27

+0

'所有的请求都以ASCII码CR结束,然后ASCII LF。' https://tools.ietf.org/html/rfc3912 2.协议规范 – brewmanz 2017-04-11 03:31:54

-3

这里的Java解决方案,这只是打开了一个外壳和运行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(); 
    } 
} 
+0

不要为了运行whois命令而掏腰包,这会造成层出不穷的安全和性能问题。使用您的编程语言中的库来执行whois查询,或者由于协议非常简单,只需打开一个TCP套接字到端口43并发​​送您的查询即可。详情请阅读RFC3912。 – 2018-01-08 17:22:28

2

托马斯的答案才有效。

有很多不同的方法可以找出这个问题,但没有一个(AFAIK)可以为每个域名注册管理机构统一使用。

一些域名支持SRV记录在DNS中_nicname._tcp服务,但也有问题,与因为没有公认的标准尚未就如何防止服务了SRV记录的子域名,其覆盖这些正式登记(见http://tools.ietf.org/html/draft-sanz-whois-srv-00)。

对于很多TLD,您可以将您的查询发送至<tld>.whois-servers.net。这实际上工作得很好,但要注意,它不适用于所有正式委派第二级域名的情况。

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

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

p.s.正如大多数IETF协议一样,WHOIS中的正式行尾分隔符是CRLF,而不仅仅是LF

2

我发现了一些提供此信息的Web服务。这个是免费的,对我来说非常棒。 http://www.webservicex.net/whois.asmx?op=GetWhoIS

+0

看起来很有希望,但我得到:System.Net.Sockets.SocketException:请求的名称是有效的,但没有找到请求类型的数据 在whois.whois.GetWhoIS(字符串主机名)(即使在输入IP地址字段本身) – Jimmy 2014-03-25 14:13:38

4

我找到了一个完美的C#示例here.

它的代码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(); 
} 
+1

添加,我不得不添加`使用System.Net.Sockets;使用System.IO;`完成代码... – KingsInnerSoul 2016-07-07 02:43:04

2

我在这里找到了一个完美的C#示例。这是11行代码直接复制并粘贴到您自己的应用程序中。但首先,你应该添加一些using语句,以确保处置方法正确调用以防止内存泄漏:

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()); 
      } 
     } 
     } 
    } 
} 
相关问题