UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Пример: определяем, включены ли контрольные суммы UDP
Теперь мы приведем простой пример использования функции
sysctl
Листинг 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: %dn", val);
17 exit(0);
18 }
2-4
<netinet/udp_var.h>
sysctl
10-16
newp
sysctl
newp
oldp
oldenp
18.5. Функция get_ifi_info (повтор)
Вернемся к примеру из раздела 17.6 — возвращение всех активных интерфейсов в виде связного списка структур
ifi_info
prifinfo
get_ifi_info
sysctl
SIOCGIFCONF
ioctl
Сначала в листинге 18.8 мы представим функцию
net_rt_iflist
sysctl
NET_RT_IFLIST
Листинг 18.8. Вызов функции sysctl для возвращения списка интерфейсов
//libroute/net_rt_iflist.c
1 #include "unproute.h"
2 char*
3 net_rt_iflist(int family, int flags, size_t *lenp)
4 {
5 int mib[6];
6 char *buf;
7 mib[0] = CTL_NET;
8 mib[1] = AF_ROUTE;
9 mib[2] = 0;
10 mib[3] = family; /* только адреса этого семейства */
11 mib[4] = NET_RT_IFLIST;
12 mib[5] = flags; /* индекс интерфейса или 0.*/
13 if (sysctl(mib, 6, NULL, lenp, NULL, 0) < 0)
14 return (NULL);
15 if ((buf = malloc(*lenp)) == NULL)
16 return (NULL);
17 if (sysctl(mib, 6, buf, lenp, NULL, 0) < 0) {
18 free(buf);
19 return (NULL);
20 }
21 return (buf);
22 }
7-14
mib
sysctl
lenp
15-21
sysctl
lenp
Поскольку размер таблицы маршрутизации или число интерфейсов может изменяться между двумя вызовами функции sysctl, значение, возвращаемое при первом вызове, содержит поправочный множитель 10% [128, с. 639-640].
В листинге 18.9 показана первая половина функции
get_ifi_info
Листинг 18.9. Функция get_ifi_info, первая половина
//route/get_ifi_info.c
3 struct ifi_info *