C# 如何在我的程序中获取域名的whois信息?
我想从我的c#/java程序中获取域名的whois信息。有没有一个简单的方法可以做到这一点 我认为,最简单的方法是在端口43上与whois服务器进行套接字连接。发送域名,后跟换行符并读取响应。以下是Java解决方案,它只需打开一个shell并运行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
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。