Например, вызов функции ioctl () с кодом SIOCGIFCONF возвращает список всех активных интерфейсов с кодом SIOCGIFBRDADDR — широковещательный адрес конкретного интерфейса. Информация о выбранном интерфейсе передается между программой и операционной системой в упакованной двоичной структуре, указанной в качестве третьего параметра функции ioctl(). В функциональных кодах, связанных с интерфейсом, используются два типа данных: структура ifreq служит для передачи в прямом и обратном направлении информации о конкретном интерфейсе, а структура ifconf применяется при выборке списка всех активных интерфейсов.
Рассмотрим это на небольшом примере. Допустим, уже известно о наличии интерфейса Ethernet с именем tuO (этот интерфейс соответствует интерфейсу Ethernet “Tulip” на компьютере Digital Tru64 UNIX). Для выборки его широковещательного адреса можно использовать следующий фрагмент кода.
my $ifreq = pack(fZ16 xl6f, ftuOf);
ioctl($sock,SIOCGIFBRDADDR,$ifreq);
my ($name,$family,$addr) = unpack('Z16 s x2 a4',$ifreq);
print "broadcast - ", inet__ntoa ($addr), "n";
Имя интерфейсной платы упаковывается в структуру ifreq и передается функции ioctl () с использованием функционального кода SIOCGIFBRDADDR. Функции ioctl () возвращает в переменной $ifreq результат, который распаковывается и отображается. Для обеспечения правильной работы этого фрагмента кода необходимо знать значение константы SIOCGIFBRDADDR и “магические” форматы, используемые для упаковки и распаковки структуры ifreq. Источники этой информации будут описаны в следующем разделе.
Таблица: Функциональные коды функции ioctl (), предназначенные для
выборки информации об интерфейсе
Код
Параметр
Описание
SIOCGIFCONF
ifconf
Выборка списка интерфейсов
SIOCGIFADDR
if req
Получение IP-адреса интерфейса
SIOCGIFBRDADDR
if req
Получение широковещательного адреса интерфейса
SIOCGIFNETMASK
ifreq
Получение маски сети интерфейса
SIOCGIRDSTADDR
if req
Получение адреса назначения двухточечного интерфейса
SIOCGIFHWADDR
ifreq
Получение аппаратного адреса интерфейса
SIOCGIFFLAGS
ifreq
Получение атрибутов интерфейса
В вызове функции ioctl (), связанном с определением характеристик интерфейса можно передать любой открытый сокет, даже тот, который был создан для другой цели.