PC АД PC АД
PC АД

Почта Домой

Кто там?! Whois-клиент на php.

Что такое 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; /* Возвращаем указатель на сокет */



Malder © 2004
Используются технологии uCoz