UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
64-72lastname73-77SIOCGIFFLAGSioctlioctlifreqifreqВ листинге 17.6 представлена третья часть нашей функции.
Листинг 17.6. Получение и возвращение адресов интерфейса
//ioctl/get_ifi_infо.c78 ifi = Calloc(1, sizeof(struct ifi_info));79 *ifipnext = ifi; /* prev указывает на новую структуру */80 ifipnext = &ifi->ifi_next; /* сюда указывает указатель на следующую структуру */81 ifi->ifi_flags = flags; /* значения IFF_xxx */82 ifi->ifi_myflags = myflags; /* значения IFI_xxx */83 #if defined(SIOCGIFMTU) && defined(HAVE_STRUCT_IFREQ_IFR_MTU)84 Ioctl(sockfd, SIOCGIFMTU, &ifrcopy);85 ifi->ifi_mtu = ifrcopy.ifr_mtu;86 #else87 ifi->ifi_mtu = 0;88 #endif89 memcpy(ifi->ifi_name, ifr->ifr_name, IFI_NAME);90 ifi->ifi_name[IFI_NAME-1] = ' ';91 /* если sockaddr_dl относится к другому интерфейсу, он игнорируется */92 if (sdlname == NULL || strcmp(sdlname, ifr->ifr_name) != 0)93 idx = hlen = 0;94 ifi->ifi_index = idx;95 ifi->ifi_hlen = hlen;96 if (ifi->ifi_hlen > IFI_HADDR)97 ifi->ifi_hlen = IFI_HADDR;98 if (hlen)99 memcpy(ifi->ifi_haddr, haddr, ifi->ifi_hlen);78-99ifi_infocallосifi_hlenifi_nextВ листинге 17.7 представлена последняя часть нашей функции.
Листинг 17.7. Получение и возврат адреса интерфейса
100 switch (ifr->ifr_addr.sa_family) {101 case AF_INET:102 sinptr = (struct sockaddr_in*)&ifr->ifr_addr;103 ifi->ifi_addr = Calloc(1, sizeof(struct sockaddr_in));104 memcpy(ifi->ifi_addr, sinptr, sizeof(struct sockaddr_in));105 #ifdef SIOCGIFBRDADDR106 if (flags & IFF_BROADCAST) {107 Ioctl(sockfd, SIOCGIFBRDADDR, &ifrcopy);108 sinptr = (struct sockaddr_in*) &ifrcopy.ifr_broadaddr;109 ifi->ifi_brdaddr = Calloc(1, sizeof(struct sockaddr_in));110 memcpy(ifi->ifi_brdaddr, sinptr, sizeof(struct sockaddr_in));111 }112 #endif113 #ifdef SIOCGIFDSTADDR114 if (flags & IFF_POINTOPOINT) {115 Ioctl(sockfd, SIOCGIFDSTADDR, &ifrcopy);116 sinptr = (struct sockaddr_in*) &ifrcopy.ifr_dstaddr;117 ifi->ifi_dstaddr = Calloc(1, sizeof(struct sockaddr_in));118 memcpy(ifi->ifi_dstaddr, sinptr, sizeof(struct sockaddr_in));119 }120 #endif121 break;122 case AF_INET6:123 sin6ptr = (struct sockaddr_in6*)&ifr->ifr_addr;124 ifi->ifi_addr = Calloc(1, sizeof(struct sockaddr_in6));125 memcpy(ifi->ifi_addr, sin6ptr, sizeof(struct sockaddr_in6));126 #ifdef SIOCGIFDSTADDR127 if (flags & IFF_POINTOPOINT) {128 Ioctl(sockfd, SIOCGIFDSTADDR, &ifrcopy);129 sin6ptr = (struct sockaddr_in6*)&ifrcopy.ifr_dstaddf;130 ifi->ifi_dstaddr = Calloc(1, sizeof(struct sockaddr_in6));
