
Что такое Whois?
Whois - это сетевая служба, предоставляющая интерфейс для доступа к базе данных, содержащей сведения о доменных именах интернета, сетях организаций и ответственных лицах. Все эти бесценные сведения может получить любой желающий, подключившись телнетом на 43 порт Whois-сервера (например, whois.ripe.net) и потребовав интересующую его информацию. Причем запрос, само собой, должен быть составлен в соответствии с семантическими требованиями сервиса. И эти самые требования описаны в соответствующих RFC - они чрезвычайно просты и прозрачны. Так, чтобы запросить сведения о каком-либо домене, следует просто ввести его имя (например, ired.ru). Чтобы выяснить, к сети какой организации относится определенный IP, следует ввести его адрес - например, 194.56.12.11.
Кодим
Ну что же, цель ясна, средства тоже – понеслась :). Первым делом напишем функцию, которая подключится к Whois-узлу, отправит запрос и вернет ответ сервера:
Код отправки запроса
function WhoisQuery($server="whois.ripe.net", $query) {
$data="";
/* Создаем сокет с 43-м портом указанного пользователем узла */
$sp=fsockopen($server, 43);
if(!$sp) {
echo "Не удалось подключиться к сервису Whois!:(<br>\n"; return 0;
}
/* Отправляем запрос */
fputs($sp, $query."\r\n");
while(!feof($sp)) {
/* Читаем в переменную $data данные цугами по 1 Кб */
$data .= fread($sp, 1024); }
fclose($sp);
return $data;
}
Функция принимает два параметра: адрес Whois-сервера и запрос к нему (фактически, IP-адрес или доменное имя). Причем для первого параметра предусмотрено значение по умолчанию - whois.ripe.net. Функция создает соединение с сервером, а в переменную $sp помещается дескриптор на этот сокет. Если же соединиться не удалось, то функция выводит сообщение об ошибке и возвращает 0. В противном случае, программа пишет в сокет запрос, добавляя в его конец последовательность символов "\r\n" - перевод каретки и перенос строки (аналог нажатия клавиши ENTER). Затем блок читает данные из сокета по одному килобайту и дописывает их на каждом проходе в переменную $data (дописывание осуществляется при помощи конструкции ".="). В конце процедуры мы освобождаем память из-под указателя на уже убитый сокет и возвращаем переменную $data. Такая вот процедура. Теперь настал черед создать пользовательский интерфейс для работы с нашей программой. Мне не пришло в голову ничего лучше, чем просто создать поле с запросом, а строчкой ниже вызывать нашу процедуру:
Вывод формы
echo "<form action=\"\" method=get>
Query: <input type=text name=query value=$query><br>
<input type=submit>";
if(isset($query)) {
$data = WhoisQuery("whois.ripe.net", $query);
echo "<pre>".$data."</pre>";
}
Обрати внимание на следующую деталь. Вывод нашей функции выделен тегами <pre> - это указывает на то, что информация должна обрабатываться как текстовая. Тут, прежде всего, имеется в виду шрифт Courier и символ '\n', переводящий строку.
Впрочем, никто не мешает написать дополнительную функцию, которая будет красиво форматировать данные. Например, выделять имена узлов красненьким, адреса - зелененьким, а имена - синеньким цветом. Но скажи, тебе оно надо? :)
Можно также добавить в систему возможность работы с несколькими Whois-серверами, более того, можно, в зависимости от зоны введенного домена, работать с различными Whois-серверами. Но я решил предоставить тебе возможность самому реализовать все эти функции, если, конечно, тебе это необходимо. А вообще, написанная программа была лишь неплохим учебным пособием. Так что, при наличии фантазии, ты можешь сделать из нее все что угодно :). Добавлю только, что все описанные в этой статье документы и программы, а также куча другой полезной информации, ты можешь найти на CD либо на сайте www.ired.ru.
Как работать с прокси-сервером?
Мне приходит много писем от читателей, причем очень часто они просят рассказать о том, как работать с HTTP-соединениями через proxy-сервер. Некоторые даже просят прислать ссылку на класс, о котором я где-то вскользь упоминал :). Надо заметить, мне не очень радостно получать такие письма - ты уже должен был сам научиться писать эту ерунду. Но все равно помогу.
Мы напишем свой класс. Поскольку с базовыми принципами ООП ты уже знаком и с сокетами работать умеешь, непонятки возникнуть не должны. Поехали. Прежде всего определим два внешних свойства нашего будущего класса: адрес прокси и порт, на котором он висит. Затем реализуем метод httpOpen, открывающий http-соединение с сервером через прокси-сервер. Собственно, сам код с подробными комментариями смотри на врезке, а мне же остается только поздравить всех особей мужского пола с праздником - берегите, друзья, отечество! Одно оно у нас такое :).
class phtt
var $proxy="";
var $proxy_p=0;
function httpOpen($host, $path, $port=80)
{
/* Если адрес прокси-сервера не определен */
if(empty($this->proxy)) {
$connect2 = $host;
$connectPost = $port;
} else {
$connect2 = $this->proxy;
$connectPort = $this->proxy_p;
}
/* Составляем полный url документа */
$url = "http://".$host.":".$port.$path;
$query = "GET $url HTTP/1.0\r\n".
"Host: $host:$port\r\n".
"User-agent: Xakep\r\n".
"\r\n";
/* Подключаемся к узлу */
$sp = fsockopen($connect2, $connectPort);
/* Если не получилось... */
if(!$sp) {echo "Bad proxy!!!:("; return 0; }
fputs ($fp, $query); /* Отправляем запрос */
return $sp; /* Возвращаем указатель на сокет */
|