Как получить whois информацию о доменном имени в моей программе? - PullRequest
3 голосов
/ 10 сентября 2008

Я хочу получить whois информацию о доменном имени из моих программ на c # / java. Есть ли простой способ сделать это?

Ответы [ 6 ]

6 голосов
/ 01 июля 2009

Я нашел идеальный пример C # на dotnet-snippets.com (, которого больше нет ).

Это 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();
}
4 голосов
/ 10 сентября 2008

Думаю, самый простой способ - это сокетное соединение с whois-сервером через порт 43. Отправьте имя домена, за которым следует новая строка, и прочитайте ответ.

2 голосов
/ 24 апреля 2013

Я нашел идеальный пример 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());
            }
         }
      }
   }
}
2 голосов
/ 29 мая 2009

Я нашел несколько веб-сервисов, которые предлагают эту информацию. Этот бесплатный и отлично работал для меня. http://www.webservicex.net/whois.asmx?op=GetWhoIS

2 голосов
/ 07 октября 2008

Ответ Томаса будет работать, только если вы знаете , к какому серверу «whois» подключиться.

Существует много разных способов выяснить это, но ни один из них (AFAIK) не работает одинаково для каждого реестра домена.

Некоторые доменные имена поддерживают запись SRV для службы _nicname._tcp в DNS, но есть проблемы с этим, потому что пока нет общепринятого стандарта о том, как запретить субдомену обслуживать 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. официальный разделитель конца строки в WHOIS, как и в большинстве протоколов IETF, равен CRLF, а не просто LF.

0 голосов
/ 10 сентября 2008

Вот решение 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();
    }
}
...