UNIX: разработка сетевых приложений
Для получения значений используется аргумент
. Он указывает на буфер, в котором ядро сохраняет значение. Аргументoldpимеет тип «значение-результат»: когда функция вызывается, значение, на которое указываетoldenp, задает размер этого буфера, а по завершении функции значением этого аргумента становится количество данных, сохраненных ядром в буфере. Если размера буфера недостаточно, возвращается ошибкаoldenp. В специальном случаеENOMEMможет быть пустым указателем, aoldp— непустым указателем, и тогда ядро определяет, сколько данных возвратилось бы при вызове, сообщая это значение черезoldenp.oldenpЧтобы установить новое значение, используется аргумент
, указывающий на буфер размераnewp. Если новое значение не задается,newlenдолжен быть пустым указателем, anewpдолжен быть равен нулю.newlenВ руководстве (man) по применению функции
подробно описывается различная системная информация, которую можно получить с помощью этой функции: информация о файловых системах, виртуальной памяти, ограничениях ядра, аппаратных характеристиках и т.д. Нас интересует сетевая подсистема, на которую указывает первый элемент массива name, равныйsysctl(константыCTL_NETопределяются в заголовочном файлеCTL_<i>xxx</i>). Тогда второй элемент может быть одним из перечисленных ниже.<sys/sysctl.h>■
. Получение или установка переменных, влияющих на протоколы Интернета. Следующий уровень с помощью одной из константAF_INETзадает протокол. BSD/OS 3.0 предоставляет на этом уровне около 30 переменных, управляющих такими свойствами, как генерация ядром переадресации ICMP, использование параметров TCP из RFC 1323, отправка контрольных сумм UDP и т.д. Пример подобного применения функцииIPROTO_<i>xxx</i>мы покажем в конце этого раздела.sysctl■
. Получение или установка информации канального уровня, такой как число интерфейсов PPP.AF_LINK■
. Возвращение информации либо о таблице маршрутизации, либо о списке интерфейсов. Мы вскоре опишем эту информацию.AF_ROUTE■
. Получение или установка некоторых переменных уровня сокета, таких как максимальный размер буфера отправки или приема сокета.AF_UNSPECКогда вторым элементом массива
являетсяname, третий элемент (номер протокола) всегда нулевой (поскольку протоколы внутри семействаAF_ROUTEотличаются от протоколов, например, в семействеAF_ROUTE), четвертый элемент — это семейство адресов, а пятый и шестой элементы задают выполняемые действия. Вся эта информация обобщается в табл. 18.3.AF_INETТаблица 18.3. Информация функции sysctl, возвращаемая для маршрутизирующего домена
name[] Возвращает таблицу Возвращает кэш APR маршрутизации Возвращает список интерфейсов 0 CTL_NET CTL_NET CTL_NET 1 AF_ROUTE AF_ROUTE AF_ROUTE 2 0 0 0 3 AF_INET AF_INET AF_INET 4 NET_RT_DUMP NET_RT_FLAGS NET_RT_IFLIST 5 0 RTF_LLINFO 0 Поддерживаются три операции, задаваемые элементом
. (Константыname[4]определяются в заголовочном файлеNET_RT_<i>xxx</i>.) Информация возвращается через указатель<sys/socket.h>при вызове функцииoldp. Этот буфер содержит переменное число сообщенийsysctl(см. табл. 18.1).RTM_<i>xxx</i>1. Операция
возвращает таблицу маршрутизации для семейства адресов, заданного элементомNET_RT_DUMP. Если задано нулевое семейство адресов, возвращаются таблицы маршрутизации для всех семейств адресов.name[3]Рис. 18.4. Информация возвращаемая функцией sysctl для команд CTL_NET и NET_RT_IFLIST
Таблица маршрутизации возвращается как переменное число сообщений
, причем за каждым сообщением следует до четырех структур адреса сокета: получатель, шлюз, маска сети и маска клонирования записи в таблице маршрутизации. Пример такого сообщения мы показали в правой части рис. 18.1, а в нашем коде в листинге 18.4 проводится анализ одного из сообщений. В результате применения этой операции функцииRTM_GETядром возвращается одно или несколько таких сообщений.sysctl2. Операция
возвращает таблицу маршрутизации для семейства адресов, заданного элементомNET_RT_FLAGS, но учитываются только те записи таблицы маршрутизации, для которых значение флагаname[3]равно указанному в элементеRTF_<i>xxx</i>. У всех записей кэша ARP в таблице маршрутизации установлен бит флагаname[5].RTF_LLINFOИнформация возвращается в том же формате, что и в предыдущем пункте.
3. Операция
возвращает информацию обо всех сконфигурированных интерфейсах. Если элементNET_RT_IFLISTненулевой, это номер индекса интерфейса и возвращается информация только об этом интерфейсе. (Более подробно об индексах интерфейсов мы поговорим в разделе 18.6.) Все адреса, присвоенные каждому интерфейсу, также возвращаются, и если элементname[5]ненулевой, возвращаются только адреса для семейства адресов, указанного в этом элементе.name[3]Для каждого интерфейса возвращается по одному сообщению
, за которым следует одно сообщениеRTM_IFINFOдля каждого адреса, заданного для интерфейса. За сообщением RTM_RTM_NEWADDRследует по одной структуре адреса сокета канального уровня, а за каждым сообщениемIFINFO— до трех структур адреса сокета: адрес интерфейса, маска сети и широковещательный адрес. Эти два сообщения представлены на рис. 18.4.RTM_NEWADDR
