UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Прежде чем вызвать функцию
ioctlifconfioctlifconf
Рис. 17.1. Инициализация структуры ifconf перед вызовом SIOCGIFCONF
Если мы предположим, что ядро возвращает две структуры
ifreqioctlioctlifc_lenifconfifreq
Рис. 17.2. Значения, возвращаемые в результате вызова SIOCGIFCONF
Указатель на структуру
ifreqioctlifrequnion#defineifr_ifru17.6. Функция get_ifi_info
Поскольку многим программам нужно знать обо всех интерфейсах системы, мы разработаем нашу собственную функцию
get_ifi_infoSIOCGIFCONFioctlBSD/OS предоставляет функцию getifaddrs, имеющую аналогичную функциональность.
Поиск по всему дереву исходного кода BSD/OS 2.1 показывает, что 12 программ выполняют вызов SIOCGIFCONF функции ioctl для определения присутствующих интерфейсов.
Сначала мы определяем структуру
ifi_infounpifi.hЛистинг 17.2. Заголовочный файл unpifi.h
//ioctl/unpifi.h 1 /* Наш собственный заголовочный файл для программ, которым требуется 2 информация о конфигурации интерфейса. Включаем его вместо "unp.h". */ 3 #ifndef __unp_ifi_h 4 #define __unp_ifi_h 5 #include "unp.h" 6 #include <net/if.h> 7 #define IFI_NAME 16 /* то же, что и IFNAMSIZ в заголовке <net/if.h> */ 8 #define IFI_HADDR 8 /* с учетом 64-битового интерфейса EUI-64 в будущем */ 9 struct ifi_info {10 char ifi_name[IFI_NAME]; /* имя интерфейса, заканчивается символом конца строки */11 short ifi_index; /* индекс интерфейса */12 short ifi_mtu; /* MTU для интерфейса */13 u_char ifi_haddr[IFI_HADDR]; /* аппаратный адрес */14 u_short ifi_hlen; /* количество байтов в аппаратном адресе: 0, 6, 8 */15 short ifi_flags; /* константы IFF_xxx из <net/if.h> */16 short if_myflags; /* наши флаги IFI_xxx */17 struct sockaddr *ifi_addr; /* первичный адрес */18 struct sockaddr *ifi_brdaddr; /* широковещательный адрес */19 struct sockaddr *ifi_dstaddr; /* адрес получателя */20 s truct ifi_info *ifi_next; /* следующая из этих структур */21 };22 #define IFI_ALIAS 1 /* ifi_addr - это псевдоним */23 /* прототипы функций */24 struct ifi_info *get_ifi_info((int, int);25 struct ifi_info *Get_ifi_info(int, int);26 void free_ifi_info(struct ifi_info*);27 #endif /* _unp_ifi_h */9-21ifi_nextifi_infofree_ifi_infoПеред тем как представить реализацию нашей функции
ifi_infoifconfigЛистинг 17.3. Программа prifinfo, вызывающая нашу функцию ifi_info
//ioctl/prifinfo.c 1 #include "unpifi.h"
