UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
17
AF_ROUTE
18-25
rt_msghdr
26-29
rt_msghdr
sockaddr_in
30-34
write
Вторая часть этой программы показана в листинге 18.4. Она обрабатывает ответ.
Листинг 18.4. Вторая часть программы, запускающая команду RTM_GET на маршрутизирующем сокете
//route/getrt.c
35 rtm = (struct rt_msghdr*)buf;
36 sa = (struct sockaddr*)(rtm + 1);
37 get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
38 if ((sa = rti_infо[RTAX_DST]) != NULL)
39 printf("dest: %sn", Sock_ntop_host(sa, sa->sa_len));
40 if ((sa = rti_infо[RTAX_GATEWAY]) != NULL)
41 printf("gateway: %sn", Sock_ntop_host(sa, sa->sa_len));
42 if ((sa = rti_info[RTAX_NETMASK]) != NULL)
43 printf("netmask: %sn", Sock_masktop(sa, sa->sa_len));
44 if ((sa = rti_info[RTAX_GENMASK]) != NULL)
45 printf("genmask: %sn", Sock_masktop(sa, sa->sa_len));
46 exit(0);
47 }
34-35
rtm
rt_msghdr
sa
36
rtm_addrs
rt_msghdr
get_rtaddrs
sa
rti_info
rti_info
Рис. 18.2. Структура rti_info, заполненная с помощью нашей функции get_rtaddrs
Затем наша программа проходит массив
rti_info
37-44
sock_ntop_host
sock_masktop
В листинге 18.5 показана наша функция
get_rtaddrs
Листинг 18.5. Создание массива указателей на структуры адреса сокета в маршрутизирующем сообщении
//libroute/get_rtaddrs.c
1 #include "unproute.h"
2 /*
3 * Округляем 'а' до следующего значения, кратного 'size'
4 */
5 #define ROUNDUP(a, size) (((a) & ((size)-1)) ? (1 + ((a) | ((size)-1))) : (a))
6 /* Переходим к следующей структуре адреса сокета.
7 * Если sa_len равно 0, это значит, что
8 * размер выражен числом типа u_long).
9 */
10 #define NEXT_SA(ap) ар = (SA*)
11 ((caddr_t)ар + (ap->sa_len ? ROUNDUP(ap->sa_len, sizeof(u_long)) :
12 sizeof(u_long)))
13 void
14 get_rtaddrs(int addrs, SA *sa, SA **rti_info)
15 {
16 int i;
17 for (i = 0; i < RTAX_MAX; i++) {
18 if (addrs & (1 << i)) {
19 rti_info[i] = sa;
20 NEXT_SA(sa);
21 } else
22 rti_info[1] = NULL;
23 }
24 }
Значение
RTAX_MAX
RTA_xxx
rtm_addrs
ifm_addrs
ifam_addrs
rti_info