Я слышал этот вопрос сотни раз: «Как мне написать скрипт, который будет проверять доступность домена?»
Сегодня я покажу вам, как реализовать так называемый сценарий WHOIS в C # и ASP.NET.
О WHOIS
Сценарий WHOIS используется для проверки доступности доменного имени или для выяснения, кому принадлежит конкретное доменное имя.
Могу поспорить, что вы уже использовали веб-поиск WHOIS, такой как http://checkdomain.com
Все, что вам нужно сделать, это ввести доменное имя, которое вы хотите проверить, и нажать кнопку отправки. В результате будет показана информация о владельце регистрации домена, если домен уже зарегистрирован, в противном случае вы получите сообщение о том, что домен все еще доступен.
Очевидно, что всякий раз, когда вы просматриваете WHOIS, вы запрашиваете какую-то базу данных, в которой хранится информация о регистрации. Однако эта база данных WHOIS не централизована, поэтому фактические доменные записи, как правило, не доступны с одного сервера WHOIS. Серверы WHOIS для регистрации доменных имен обслуживаются организацией, уполномоченной регистрировать доменные имена.
Как правило, серверы WHOIS принимают соединения через TCP через порт 43, поэтому мы можем общаться с сервером, если мы используем этот порт. Полный список серверов WHOIS можно найти на сайте http://www.mit.edu/afs/athena/contrib/potluck/Net-Services/whois-servers.list.
Импорт пространства имен
TcpClient
.Net предоставляет нам класс TcpClient
(пространство имен System.Net.Sockets
), и с его помощью мы собираемся подключиться к серверу WHOIS и напрямую запросить данные регистрации домена.
Сначала нам нужно импортировать пространства имен System.Net.Sockets
, System.Text
, System.IO
и System.Text.RegularExpressions
, потому что мы будем использовать их на нашей странице WHOIS ASP.NET:
<% @Import Namespace="System.Net.Sockets" %> <% @Import Namespace="System.Text" %> <% @Import Namespace="System.IO" %> <% @Import Namespace="System.Text.RegularExpressions" %>
Подключение к хосту
Класс TcpClient
предоставляет методы для подключения, отправки и получения данных по сети. Существует два способа подключения к удаленному хосту:
- Создайте экземпляр класса
TcpClient
без параметров, а затем вызовите один из трехTcpClient
подключенияTcpClient
:TcpClient objTCPC = new TcpClient(); objTCPC.Connect("whois.networksolutions.com", 43);
- Создайте экземпляр класса
TcpClient
используя имя хоста и номер порта сервера, к которому вы хотите подключиться. Этот конструктор автоматически установит ваше соединение:TcpClient objTCPC = new TcpClient ("whois.networksolutions.com", 43);
TcpClient objTCPC = new TcpClient ("whois.networksolutions.com", 43);
Отправка вашего запроса
Следующим шагом после успешного подключения к серверу WHOIS является отправка запроса на домен.
Сначала мы объявляем строку strDomain, которая будет содержать доменное имя, которое мы хотим найти. Мы объединяем « rn
» в конец нашего strDomain, потому что это формат, ожидаемый серверами WHOIS. Наконец, мы кодируем наш strDomain
в байтовый массив ( arrDomain
), используя метод GetBytes
класса Encoding
(пространство имен System.Text
).
string strDomain = "domain-for-check.com" + "rn"; byte[] arrDomain = Encoding.ASCII.GetBytes(strDomain);
Мы будем использовать метод GetStream
для получения объекта Stream
( System.IO namespace
), который может отправлять и получать данные в подключенном сокете:
Stream objStream = objTCPC.GetStream();
Получив доступ к объекту Stream
, мы можем записать (отправить) последовательность байтов в текущий поток, используя метод Write
:
objStream.Write(arrDomain, 0, strDomain.Length);
Получение ответа
Один из способов получить ответ сервера WHOIS — создать экземпляр класса StreamReader (пространство имен System.IO
), который считывает символы из потока байтов в определенной кодировке:
StreamReader objSr = new StreamReader (objTCPC.GetStream(), Encoding.ASCII);
Следующим шагом является использование метода ReadToEnd
нашего объекта objSr
для получения ответа сервера WHOIS:
string strServerResponse = objSr.ReadToEnd();
Поскольку мы сразу прочитали ответ сервера, нам нужно заменить символы новой строки » n
» в нашем текстовом ответе на » <br>
«, чтобы они правильно отображались в браузере. Мы можем сделать это с помощью класса Regex ( System.Text.RegularExpressions
) и, в частности, с его методом Replace
:
strServerResponse = Regex.Replace (strServerResponse, "n", "<br>");
Единственное, что остается сделать после того, как мы получим ответ сервера, — это присвоить значение lblResponse.Text
свойству lblResponse.Text
( lblResponse
— это наш серверный элемент управления lblResponse
где будет отображаться результат) и закрыть TCP-соединение с сервером WHOIS:
lblResponse.Text = strServerResponse; objTCPC.Close();
Код
Таким образом, для создания страницы ASP.NET для поиска WHOIS необходимо:
- импортировать пространства имен
System.Net.Sockets
,System.Text
,System.IO
иSystem.Text.RegularExpressions
на странице ASP.NET - подключиться к серверу WHOIS с
TcpClient
классаTcpClient
- отправить запрос домена на сервер WHOIS
- читать ответ сервера через класс
StreamReader
- замените символы новой строки »
n
» в ответе сервера на »<br>
«, используя класс Regex - отобразить строку ответа
Вот полностью функциональный код для страницы WHOIS ASP.NET. Помните, что используемые в примере серверы WHOIS могут быть заменены на любые действующие серверы WHOIS для справки. Проверьте http://www.mit.edu/afs/athena/contrib/potluck/Net-Services/whois-servers. список
Посмотрите этот полнофункциональный пример страницы ASP.NET WHOIS .
Вот код страницы:
<% @Page Language="C#" Debug="false"%> <% @Import Namespace="System.Net.Sockets" %> <% @Import Namespace="System.Text" %> <% @Import Namespace="System.IO" %> <% @Import Namespace="System.Text.RegularExpressions" %> <script language="C#" runat=server> public void btn_Click(object sender, EventArgs eArgs) { try { TcpClient objTCPC = new TcpClient(Request.Form["WhoisServer"], 43); string strDomain = Request.Form["DomainName"] + "rn"; byte[] arrDomain = Encoding.ASCII.GetBytes(strDomain); Stream objStream = objTCPC.GetStream(); objStream.Write(arrDomain, 0, strDomain.Length); StreamReader objSR = new StreamReader(objTCPC.GetStream(), Encoding.ASCII); lblResponse.Text = "<b>" + Request.Form["DomainName"] + "</b><br><br>" + Regex.Replace(objSR.ReadToEnd(),"n","<br>"); objTCPC.Close(); } catch(Exception ex) { lblResponse.Text = ex.ToString(); } } </script> <html> <head> <style> .main {font-family:Verdana; font-size:12px;} .title {font-family:Verdana; font-size:18px; font-weight:bold;} </style> </head> <body> <span class="title" align="center">WHOIS ASP.NET page</span> <form method="POST" name="MainForm" runat="server"> <table> <tr> <td class="main" align="right">Whois Server</td> <td class="main"> <asp:DropDownList class="main" id="WhoisServer" runat="server"> <asp:ListItem value="whois.networksolutions.com"> whois.networksolutions.com (.COM, .NET, .EDU)</asp:ListItem> <asp:ListItem value="whois.ripe.net">whois.ripe.net (Europe)</asp:ListItem> <asp:ListItem value="whois.cira.ca">whois.cira.ca (.CA) </asp:ListItem> <asp:ListItem value="whois.nic.uk">whois.nic.uk (.CO.UK)</asp:ListItem> <asp:ListItem value="whois.domain-registry.nl"> whois.domain-registry.nl (.NL)</asp:ListItem> </asp:DropDownList> </td> </tr> <tr> <td class="main" align="right">Domain Name:</td> <td class="main"><input type="text" class="main" name="DomainName" value=""></td> </tr> <tr> <td class="main"> </td> <td class="main"><input type="Submit" id="btnSubmit" OnServerClick="btn_Click" value="Send" runat="server" /></td> </tr> </table> <br><br> <asp:Label class="main" id="lblResponse" runat="server"/> </form> </body> </html>