#c# #java #whois #domain-name
Вопрос:
Я хочу получить whois-информацию о доменном имени из моих программ на c#/java. Есть ли простой способ сделать это?
Ответ №1:
Я нашел идеальный пример 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();
}
Комментарии:
1. Добавляя, что мне пришлось добавить
using System.Net.Sockets; using System.IO;
, чтобы завершить код…2. TcpClient, NetworkStream, BufferedStream, StreamWriter и StreamReader — все это необходимо утилизировать после использования.
Ответ №2:
Я думаю, что самый простой способ-это подключение сокета к whois-серверу на порту 43. Отправьте имя домена, за которым следует новая строка, и прочитайте ответ.
Комментарии:
1. Вам необходимо определить, какой сервер whois использовать в первую очередь. Вот пример этого: вот хороший пример: flipbit.co.uk/2009/06/querying-whois-server-data-with-c.html
2. «Все запросы завершаются с помощью ASCII CR, а затем ASCII LF». tools.ietf.org/html/rfc3912 2. Спецификация протокола
Ответ №3:
Ответ Томаса будет работать только в том случае, если вы знаете, к какому серверу «whois» подключиться.
Существует множество различных способов выяснить это, но ни один (AFAIK) не работает одинаково для каждого реестра доменов.
Некоторые доменные имена поддерживают SRV
запись для _nicname._tcp
службы в DNS, но с этим возникают проблемы, поскольку пока не существует общепринятого стандарта о том, как запретить поддомену обслуживать SRV
записи, которые переопределяют записи официального реестра (см. https://datatracker.ietf.org/doc/html/draft-sanz-whois-srv-00).
Для многих ДВУ можно отправить запрос по <tld>.whois-servers.net
адресу . На самом деле это работает довольно хорошо, но имейте в виду, что это не будет работать во всех случаях, когда существуют официально делегированные домены второго уровня.
Например, .uk
существует несколько официальных поддоменов, но только некоторые из них управляются .uk
реестром, а другие имеют свои собственные службы WHOIS, и их нет в whois-servers.net
базе данных.
К сожалению, существуют также «неофициальные» реестры, такие как .uk.com
, которые находятся в whois-servers.net
базе данных.
p.s. официальным разделителем конца строки в WHOIS, как и в большинстве протоколов IETF , является CRLF
не только LF
.
Ответ №4:
Я нашел несколько веб-сервисов, которые предоставляют эту информацию. Это бесплатно и отлично сработало для меня. http://www.webservicex.net/whois.asmx?op=GetWhoIS
Комментарии:
1. Выглядело многообещающе, но я получаю: System.Net.Сокеты. Исключение SocketException: Запрошенное имя является допустимым, но в whois не было найдено данных запрошенного типа. кто. GetWhoIS(Строковое имя хоста) (даже при вводе ip-адреса в поле на самой информационной странице)
Ответ №5:
Я нашел здесь идеальный пример 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());
}
}
}
}
}
Комментарии:
1. Спасибо, что опубликовали этот ответ. Я отредактировал ваш пост, чтобы исправить некоторые проблемы с форматированием кода.
2. Вы действительно запустили код? При запуске этого кода я получил исключение «Не удается получить доступ к закрытому потоку». Если я не поставил использование перед StreamReader streamReaderReceive = новый StreamReader(bufferedStreamWhois), я не получил исключения.
Ответ №6:
Вот решение 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();
}
}
Комментарии:
1. Не тратьте деньги только на то, чтобы запустить команду whois, это создаст бесконечный поток проблем с безопасностью и производительностью. Вместо этого используйте библиотеки вашего языка программирования для выполнения запросов whois или, поскольку протокол настолько прост, просто откройте TCP-сокет на порт 43 и отправьте свой запрос. Подробнее читайте RFC3912.