Пример: определяем, включены ли контрольные суммы UDP
Пример: определяем, включены ли контрольные суммы UDP
Теперь мы приведем простой пример использования функции sysctl с протоколами Интернета для проверки, включены ли контрольные суммы UDP. Некоторые приложения UDP (например, BIND) проверяют при запуске, включены ли контрольные суммы UDP, и если нет, пытаются включить их. Для того чтобы включить подобное свойство, требуются права привилегированного пользователя, но мы сейчас просто проверим, включено это свойство или нет. В листинге 18.7 представлена наша программа.
Листинг 18.7. Проверка включения контрольных сумм
//route/checkudpsum.c
1 #include "unproute.h"
2 #include <netinet/udp.h>
3 #include <netinet/ip_var.h>
4 #include <netinet/udp_var.h> /* для констант 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 ", val);
17 exit(0);
18 }
Включение системных заголовков
2-4 Следует включить заголовочный файл <netinet/udp_var.h>, чтобы получить определение констант UDP функции sysctl. Для него требуются два других заголовка.
Вызов функции sysctl
10-16 Мы размещаем в памяти массив целых чисел с четырьмя элементами и храним константы, соответствующие иерархии, показанной на рис. 18.3. Поскольку мы только получаем переменную и не присваиваем ей значение, аргумент newp функции sysctl мы задаем как пустой указатель, и поэтому аргумент newp этой функции имеет нулевое значение, oldp указывает на нашу целочисленную переменную, в которую сохраняется результат, a oldenp указывает на переменную типа «значение- результат», хранящую размер этого целого числа. Мы выводим либо 0 (отключено), либо 1 (включено).
Данный текст является ознакомительным фрагментом.