Шрифт:
Первые три элемента каждой структуры одни и те же: длина, версия и тип сообщения. Тип — это одна из констант из первого столбца табл. 18.1. Элемент длины
Элементы
Таблица 18.2. Константы, используемые для ссылки на структуры адреса сокета в маршрутизирующих сообщениях
Битовая маска, константа | Битовая маска, значение | Индекс массива, константа | Индекс массива, значение | Структура адреса сокета содержит |
---|---|---|---|---|
RTA_DST | 0x01 | RTAX_DST | 0 | Адрес получателя |
RTA_GATEWAY | 0x02 | RTAX_GATEWAY | 1 | Адрес шлюза |
RTA_NETMASK | 0x04 | RTAX_NETMASK | 2 | Маска сети |
RTA_GENMASK | 0x08 | RTAX_GENMASK | 3 | Маска клонирования |
RTA_IFP | 0x10 | RTAX_IFP | 4 | Имя интерфейса |
RTA_IFA | 0x20 | RTAX_IFA | 5 | Адрес интерфейса |
RTA_AUTHOR | 0x40 | RTAX_AUTHOR | 6 | Отправитель запроса на перенаправление |
RTA_BRD | 0x80 | RTAX_BRD | 7 | Адрес получателя типа «точка-точка» или широковещательный |
RTAX_MAX | 8 | Максимальное количество элементов |
В том случае, когда имеется множество структур адреса сокета, они всегда располагаются в порядке, показанном в таблице.
Пример: получение и вывод записи из таблицы маршрутизации
Теперь мы покажем пример использования маршрутизирующих сокетов. Наша программа получает аргумент командной строки, состоящий из адреса IPv4 в точечно-десятичной записи, и отправляет ядру сообщение
мы увидим, что этот адрес получателя использует маршрут по умолчанию (который хранится в таблице маршрутизации с IP-адресом получателя 0.0.0.0 и маской 0.0.0.0). Маршрутизатор следующей ретрансляции — это интернет-шлюз нашей системы. Если мы выполним
задав в качестве получателя главную сеть Ethernet, получателем будет сама сеть. Теперь шлюзом является исходящий интерфейс, возвращаемый в качестве структуры
Перед тем как представить исходный код, мы показываем на рис. 18.1, что именно мы пишем в маршрутизирующий сокет и что возвращает ядро.
Рис. 18.1. Обмен данными с ядром на маршрутизирующем сокете для команды RTM_GET
Мы создаем буфер, содержащий структуру