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>sysctl10-16newpsysctlnewpoldpoldenp18.5. Функция get_ifi_info (повтор)
Вернемся к примеру из раздела 17.6 — возвращение всех активных интерфейсов в виде связного списка структур
ifi_infoprifinfoget_ifi_infosysctlSIOCGIFCONFioctlСначала в листинге 18.8 мы представим функцию
net_rt_iflistsysctlNET_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-14mibsysctllenp15-21sysctllenpПоскольку размер таблицы маршрутизации или число интерфейсов может изменяться между двумя вызовами функции sysctl, значение, возвращаемое при первом вызове, содержит поправочный множитель 10% [128, с. 639-640].
В листинге 18.9 показана первая половина функции
get_ifi_infoЛистинг 18.9. Функция get_ifi_info, первая половина
//route/get_ifi_info.c 3 struct ifi_info *
