Пишем свой Whois-клиент на php

Тема по созданию своего whois-клиента

В Кодинге были уже, по крайней мере, две статьи про использование сокетов в PHP. Но оба материала были довольно сильно разнесены по логическому уровню работы. Если в одной статье я рассказывал о самых низкоуровневых функциях, типа fsockopen(), то во второй, напротив, мы уже оперировали объектными терминами.

Сегодня мне хотелось бы завершить, наконец, эту тему, связав «низы» с «верхами» — я решил написать клиентскую программу, которая, помимо сетевых функций, будет предоставлять пользователю удобный и расширяемый интерфейс. Для примера возьмем реализацию клиента для whois-сервера. На самом деле, это, конечно, детская задача, но скажи честно, ты знаешь, как это сделать? Если нет (а судя по приходящим письмам, большинство читателей ответили именно так), читай дальше. Знаешь — тоже почитай. Может быть, вынесешь для себя что-то новое :).

Что такое 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!:(
\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 "

Query:

";

if(isset($query)) {

$data = WhoisQuery("whois.ripe.net", $query);

echo "

".$data."

";

}

Обрати внимание на следующую деталь. Вывод нашей функции выделен тегами

- это указывает на то, что информация должна обрабатываться как текстовая. Тут, прежде всего, имеется в виду шрифт 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; /* Возвращаем указатель на сокет */
}
}

Добавить комментарий

Ваш e-mail не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом.Узнайте как обрабатываются ваши данные комментариев.