Уильям Стивенс - UNIX: разработка сетевых приложений
- Название:UNIX: разработка сетевых приложений
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:5-94723-991-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
11 else if (sa->sa_len == 6)
12 snprintf(str, sizeof(str), "%d.%d.0.0", *ptr, *(ptr + 1));
13 else if (sa->sa_len == 7)
14 snprintf(str, sizeof(str), "%d.%d.%d.0", *ptr, *(ptr + 1), *(ptr + 2));
15 else if (sa->sa_len == 8)
16 snprintf(str, sizeof(str), "%d.%d.%d.%d",
17 *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3));
18 else
19 snprintf(str, sizeof(str), "(unknown mask, len = %d, family = %d)",
20 sa->sa_len, sa->sa_family);
21 return (str);
22 }
7-21
Если длина равна нулю, то подразумевается маска 0.0.0.0. Если длина равна 5, хранится только первый байт 32-разрядной маски, а для оставшихся трех байтов подразумевается нулевое значение. Когда длина равна 8, хранятся все 4 байта маски.
В этом примере мы хотим прочитать ответ ядра, поскольку он содержит информацию, которую мы ищем. Но в общем случае возвращаемое значение нашей функции write
на маршрутизирующем сокете сообщает нам, успешно ли была выполнена команда. Если это вся необходимая нам информация, мы вызываем функцию shutdown
со вторым аргументом SHUT_RD
, чтобы предотвратить отправку ответа. Например, если мы удаляем маршрут, то возвращение нуля функцией write
означает успешное выполнение, а если удалить маршрут не удалось, возвращается ошибка ESRCH
[128, с. 608]. Аналогично, когда добавляется маршрут, возвращение ошибки EEXIST
при выполнении функции write
означает, что запись уже существует. В нашем примере из листинга 18.3 функция write
возвращает ошибку ESRCH
, если записи в таблице маршрутизации не существует (допустим, у нашего узла нет заданного по умолчанию маршрута).
18.4. Операции функции sysctl
Маршрутизирующие сокеты нужны нам главным образом для проверки таблицы маршрутизации и списка интерфейсов при помощи функции sysctl
. В то время как создание маршрутизирующего сокета (символьного сокета в домене AF_ROUTE
) требует прав привилегированного пользователя, проверить таблицу маршрутизации и список интерфейсов с помощью функции sysctl
может любой процесс.
#include
#include
int sysctl(int * name , u_int namelen , void * oldp , size_t * oldlenp ,
void * newp , size_t Inewlen );
Возвращает: 0 в случае успешного выполнения
Эта функция использует имена, похожие на имена базы управляющей информации (Management Information Base, MIB) простого протокола управления сетью (Simple Network Management Protocol, SNMP). В главе 25 [111] подробно описываются SNMP и его MIB. Эти имена являются иерархическими.
Аргумент name
— это массив целых чисел, задающий имя, a namelen
задает число элементов массива. Первый элемент массива определяет, какой подсистеме ядра направлен запрос. Второй элемент определяет некую часть этой подсистемы, и т.д. На рис. 18.3 показана иерархическая организация с некоторыми константами, используемыми на первых трех уровнях.

Рис. 18.4. Информация возвращаемая функцией sysctl для команд CTL_NET и NET_RT_IFLIST
Таблица маршрутизации возвращается как переменное число сообщений RTM_GET
, причем за каждым сообщением следует до четырех структур адреса сокета: получатель, шлюз, маска сети и маска клонирования записи в таблице маршрутизации. Пример такого сообщения мы показали в правой части рис. 18.1, а в нашем коде в листинге 18.4 проводится анализ одного из сообщений. В результате применения этой операции функции sysctl
ядром возвращается одно или несколько таких сообщений.
2. Операция NET_RT_FLAGS
возвращает таблицу маршрутизации для семейства адресов, заданного элементом name[3]
, но учитываются только те записи таблицы маршрутизации, для которых значение флага RTF_ xxx
равно указанному в элементе name[5]
. У всех записей кэша ARP в таблице маршрутизации установлен бит флага RTF_LLINFO
.
Информация возвращается в том же формате, что и в предыдущем пункте.
3. Операция NET_RT_IFLIST
возвращает информацию обо всех сконфигурированных интерфейсах. Если элемент name[5]
ненулевой, это номер индекса интерфейса и возвращается информация только об этом интерфейсе. (Более подробно об индексах интерфейсов мы поговорим в разделе 18.6.) Все адреса, присвоенные каждому интерфейсу, также возвращаются, и если элемент name[3]
ненулевой, возвращаются только адреса для семейства адресов, указанного в этом элементе.
Для каждого интерфейса возвращается по одному сообщению RTM_IFINFO
, за которым следует одно сообщение RTM_NEWADDR
для каждого адреса, заданного для интерфейса. За сообщением RTM_ IFINFO
следует по одной структуре адреса сокета канального уровня, а за каждым сообщением RTM_NEWADDR
— до трех структур адреса сокета: адрес интерфейса, маска сети и широковещательный адрес. Эти два сообщения представлены на рис. 18.4.
Пример: определяем, включены ли контрольные суммы UDP
Теперь мы приведем простой пример использования функции sysctl
с протоколами Интернета для проверки, включены ли контрольные суммы UDP. Некоторые приложения UDP (например, BIND) проверяют при запуске, включены ли контрольные суммы UDP, и если нет, пытаются включить их. Для того чтобы включить подобное свойство, требуются права привилегированного пользователя, но мы сейчас просто проверим, включено это свойство или нет. В листинге 18.7 представлена наша программа.
Листинг 18.7. Проверка включения контрольных сумм
//route/checkudpsum.c
1 #include "unproute.h"
2 #include
3 #include
4 #include /* для констант UDPCTL_xxx */
5 int
6 main(int argc, char **argv)
7 {
8 int mib[4], val;
9 size_t len;
10 mib[0] = CTL_NET;
11 mib[1] = AF_INET;
12 mib[2] = IPPROTO_UDP;
13 mib[3] = UDPCTL_CHECKSUM;
14 len = sizeof(val);
15 Sysctl(mib, 4, &val, &len, NULL, 0);
16 printf("udp checksum flag: %d\n", val);
17 exit(0);
18 }
2-4
Следует включить заголовочный файл , чтобы получить определение констант UDP функции sysctl
. Для него требуются два других заголовка.
10-16
Мы размещаем в памяти массив целых чисел с четырьмя элементами и храним константы, соответствующие иерархии, показанной на рис. 18.3. Поскольку мы только получаем переменную и не присваиваем ей значение, аргумент newp
функции sysctl
мы задаем как пустой указатель, и поэтому аргумент newp
этой функции имеет нулевое значение, oldp
указывает на нашу целочисленную переменную, в которую сохраняется результат, a oldenp
указывает на переменную типа «значение- результат», хранящую размер этого целого числа. Мы выводим либо 0 (отключено), либо 1 (включено).
18.5. Функция get_ifi_info (повтор)
Интервал:
Закладка: