2008-09-10 4 views

ответ

4

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

+0

Вам необходимо определить, какой сервер whois использовать первым. Вот пример этого: вот хороший пример: 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 записи для _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. официальный разделитель End-Of-Line в WHOIS, как и в большинстве протоколов IETF, составляет CRLF, а не только LF.

2

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

+0

Выглядит многообещающе, но я получаю: System.Net.Sockets.SocketException: запрашиваемое имя действительно, но данные запрашиваемого типа не найдены в whois.whois.GetWhoIS (String HostName) (даже при вводе 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

Добавление, что мне пришлось добавить `using System.Net.Sockets; используя System.IO; `для завершения кода ... – KingsInnerSoul 2016-07-07 02:43:04

2

Я нашел здесь отличный пример C#. Это 11 строк кода для копирования и вставки прямо в ваше собственное приложение. BUT FIRST вы должны добавить некоторые операторы использования, чтобы убедиться, что методы удаления правильно вызваны для предотвращения утечек памяти:

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()); 
      } 
     } 
     } 
    } 
} 
Смежные вопросы