Кто там?! Whois-клиент на php Никита Кислицин Xakep, номер #062, стр. 062-122-1 (nikitoz@real.xakep.ru, www.ired.ru) Тема по созданию своего 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!:(<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. Такая вот процедура. Теперь настал черед создать пользовательский интерфейс для работы с нашей программой. Мне не пришло в голову ничего лучше, чем просто создать поле с запросом, а строчкой ниже вызывать нашу процедуру: |