Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:
ПРИМЕЧАНИЕ

Некоторые версии Unix из более новых ослабили требование к правам пользователя для операции открытия маршрутизирующего сокета и ограничивают только передачу сообщений, изменяющих таблицу маршрутизации ядра. Это позволяет любому процессу узнать маршрут при помощи команды RTM_GET, не являясь суперпользователем.

Технически третья операция выполняется при помощи общей функции sysctl, а не маршрутизирующего сокета. Но мы увидим, что среди ее входных параметров есть семейство адресов (для описываемых в этой главе операций используется семейство AF_ROUTE), а результат она возвращает в том же формате, который используется ядром для маршрутизирующего сокета. Действительно, в ядре 4.4BSD обработка функции sysctl для семейства AF_ROUTE является частью кода маршрутизирующего сокета [128, с. 632–643].

Функция sysctl появилась в 4.4BSD. К сожалению, не все реализации, поддерживающие маршрутизирующие сокеты, предоставляют ее. Например, AIX 4.2, Digital Unix 4.0 и Solaris 2.6 поддерживают маршрутизирующие сокеты, но ни одна из этих систем не поддерживает утилиту sysctl.

18.2. Структура адреса сокета канального уровня

Структуры адреса сокета канального уровня будут встречаться нам как значения, содержащиеся в некоторых сообщениях, возвращаемых на маршрутизирующем сокете. В листинге 18.1 [1] показано определение структуры, задаваемой в заголовочном файле

<net/if_dl.h>
.

Листинг 18.1. Структура адреса сокета канального уровня

struct sockaddr_dl {

1

Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.

uint8_t sdl_len;

sa_family_t sdl_family; /* AF_LINK */

uint16_t sdl_index; /* индекс интерфейса, присвоенный системой,

если > 0 */

uint8_t sdl_type; /* тип интерфейса из <net/if_types.h>.

IFT_ETHER и т.д. */

uint8_t sdl_nlen; /* длина имени, начинается с sdl_data[0] */

uint8_t sdl_alen; /* длина адреса канального уровня */

uint8_t sdl_slen; /* адрес селектора канального уровня */

char sdl_data[12]; /* минимальная рабочая область.

может быть больше; содержит имя

интерфейса и адрес канального уровня */

};

У каждого интерфейса имеется уникальный положительный индекс. Далее в этой главе мы увидим, каким образом он возвращается функциями

if_nametoindex
и
if_nameindex
. В главе 21 при обсуждении параметров многоадресных сокетов IPv6 и в главе 27 при обсуждении дополнительных параметров сокетов IPv6 и IPv4 мы вновь вернемся к этим функциям.

Элемент

sdl_data
содержит и имя, и адрес канального уровня (например, 48-разрядный MAC-адрес интерфейса Ethernet). Имя начинается с
sdl_data[0]
и не заканчивается нулем. Начало адреса канального уровня смещено на
sdl_nlen
байтов относительно начала имени. В этом заголовочном файле для возвращения указателя на адрес канального уровня задается следующий макрос:

#define LLADDR(s) ((caddr_t)((s)->sdl_data + (s)->sdl_nlen))

Эти структуры адреса сокета имеют переменную длину [128, с. 89]. Если адрес канального уровня и имя превышают 12 байт, размер структуры будет больше 20 байт. В 32-разрядных системах размер обычно округляется в большую сторону, до следующего числа, кратного 4 байтам. Мы также увидим на рис. 22.1, что когда одна из этих структур возвращается параметром сокета

IP_RECVIF
, все три длины становятся нулевыми, а элемента
sdl_data
не существует.

18.3. Чтение и запись

Создав маршрутизирующий сокет, процесс может отправлять ядру команды путем записи в этот сокет и считывать из него информацию от ядра. Существует 12 различных команд маршрутизации, 5 из которых могут быть запущены процессом. Они определяются в заголовочном файле

<net/route.h>
и показаны в табл. 18.1.

Таблица 18.1. Типы сообщений, проходящих по маршрутизирующему сокету

  • Читать дальше
  • 1
  • ...
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку:

Тип сообщения К ядру? От ядра? Описание Тип структуры
RTM_ADD • • Добавить маршрут rt_msghdr
RTM_CHANGE • • Поменять шлюз, метрику или флаги rt_msghdr
RTM_DELADDR • Адрес был удален из интерфейса ifa_msghdr
RTM_DELETE • • Удалить маршрут rt_msghdr
RTM_GET • • Сообщить о метрике и других характеристиках маршрута rt_msghdr
RTM_IFINFO • Находится ли интерфейс в активном состоянии if_msghdr
RTM_LOCK • • Блокировка указанной метрики rt_msghdr
RTM_LOSING • Возможно, неправильный маршрут rt_msghdr