UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
2-12
sa_len
sa_len
unsigned long
unsigned long
sockaddr
Последняя функция, которую мы покажем в примере нашей программы, — это функция
sock_masktop
sa_family
sa_len
sockaddr_in
sa_data[2]
Листинг 18.6. Преобразование значения маски к формату представления
//libroute/sock_masktop.c
1 #include "unproute.h"
2 const char*
3 sock_masktop(SA *sa, socklen_t salen)
4 {
5 static char str[INET6_ADDRSTRLEN];
6 unsigned char *ptr = &sa->sa_data[2];
7 if (sa->sa_len == 0)
8 return ("0.0.0.0");
9 else if (sa->sa_len == 5)
10 snprintf(str, sizeof(str), '"%d.0.0.0", *ptr);
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
В этом примере мы хотим прочитать ответ ядра, поскольку он содержит информацию, которую мы ищем. Но в общем случае возвращаемое значение нашей функции
write
shutdown
SHUT_RD
write
ESRCH
EEXIST
write
write
ESRCH
18.4. Операции функции sysctl
Маршрутизирующие сокеты нужны нам главным образом для проверки таблицы маршрутизации и списка интерфейсов при помощи функции
sysctl
AF_ROUTE
sysctl
#include <sys/param.h>
#include <sys/sysctl.h>
int sysctl(int *<i>name</i>, u_int <i>namelen</i>, void *<i>oldp</i>, size_t *<i>oldlenp</i>,
void *<i>newp</i>, size_t <i>Inewlen</i>);
<i>Возвращает: 0 в случае успешного выполнения</i>
Эта функция использует имена, похожие на имена базы управляющей информации (Management Information Base, MIB) простого протокола управления сетью (Simple Network Management Protocol, SNMP). В главе 25 [111] подробно описываются SNMP и его MIB. Эти имена являются иерархическими.
Аргумент
name
namelen
Рис. 18.3. Иерархическая организация имен функции sysctl