Глава 16: Доступ к системным базам данных.
16.3 Получение информации о сети
Perl поддерживает сетевое программирование средствами, которые хорошо знакомы тем, кто писал программы для сетевых приложений на С. По сути дела, большинство функций Perl, обеспечивающих доступ к сети, имеют и те же имена, что их С-коллеги, и похожие параметры. В этой главе мы не можем привести полную информацию по сетевому программированию, поэтому просто рассмотрим фрагмент сетевого приложения.
Один из параметров, который вам приходится часто определять,— это IP-адрес, соответствующий сетевому имени (или наоборот). В С вы преобразуете сетевое имя в сетевой адрес с помощью программы gethostbyname(3). Затем, используя полученный адрес, вы устанавливаете связь между своей программой и другой программой, которая работает где-то в другом месте.
В Perl функция, преобразующая хост-имя в адрес, имеет то же имя, что и С-программа, и похожие параметры. Выглядит она так:
($name, $aliases, $addrtype, $1ength, @addrs) = gethostbyname($name);
# основная форма функций gethostbyname
Параметр этой функций — имя хоста, например, slate.bedrock.com, а возвращаемое значение — список из четырех и более параметров (в зависимости от того, сколько адресов связано с данным именем). Если имя хоста недействительно, функция возвращает пустой список.
Когда gethostbyname вызывается в скалярном контексте, возвращается только первый адрес.
Если gethostbyname завершается успешно, то переменной $name в качестве значения присваивается каноническое имя, которое, если входное имя — псевдоним, отличается от входного имени. Значение переменной $aliases — это список разделенных пробелами имен, под которыми данный хост известен в сети. Переменная $addrtype содержит кодовое обозначение формата представлення адреса. Для имени slate.bedrock.com мы можем предположить, что это значение указывает на IP-адрес, обычно представляемый как четыре числа из диапазона от 1 до 256, разделенных точками. Переменная $1ength содержит количество адресов. Это лишняя информация, так как в любом случае можно посмотреть на размер массива @addrs.
Наиболее полезная часть возвращаемого значения — массив @addrs. Каждый элемент данного массива — это отдельный IP-адрес, представленный во внутреннем формате и обрабатываемый в Perl как четырехсимвольная строка*. эта четырехсимвольная строка представлена в формо, понятной для других сетевых Perl-функций. Однако предположим, что нам требуется вывести результат в виде, удобном для пользователя. В данном случае нам нужно с помощью функции unpack и еще нескольких операций преобра-зовать возвращаемое значение в удобочитаемый формат. Вот код, который обеспечивает вывод одного из ІР-адресов хоста slate.bedrock.com:
Функция unpack получает четырехбайтовую строку и возвращает четыре числа. Оказывается, они стоят именно в том порядке, который нужен функции join для того, чтобы она вставила между каждой парой чисел точку и представила таким образом все это в удобочитаемой форме. Информация о простых программах-клиентах приведена в приложении В.