UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
■
SIOCGIFMETRICifr_metricrouted■
SIOCSIFMETRICifr_metricВ этом разделе мы описали наиболее типичные операции интерфейсов. Во многих реализациях появились дополнительные операции.
17.8. Операции с кэшем ARP
Операции с кэшем ARP также осуществляются с помощью функции
ioctlarpreq<net/if_arp.h>Листинг 17.9. Структура arpreq, используемая с вызовами ioctl для кэша ARP
struct arpreq { struct sockaddr arp_pa; /* адрес протокола */ struct sockaddr arp_ha; /* аппаратный адрес */ int arp_flags; /* флаги */};#define ATF_INUSE 0x01 /* запись, которую нужно использовать */#define ATF_COM 0x02 /* завершенная запись */#define ATF_PERM 0x04 /* постоянная запись */#define ATF_PUBL 0x08 /* опубликованная запись (отсылается другим узлам) */Третий аргумент функции
ioctl■
SIOCSARParp_paarp_hass_familyAF_UNSPECsa_dataATF_PERMATF_PUBLATF_INUSEATF_COM■
SIOCDARP■
SIOCGARPДобавлять или удалять записи может только привилегированный пользователь. Эти три вызова обычно делает программа
arpЗапросы функции ioctl, связанные с ARP, не поддерживаются в некоторых более новых системах, использующих для описанных операций ARP маршрутизирующие сокеты.
Обратите внимание, что невозможно с помощью функции
ioctlarp-a/dev/kmemsysctlПример: вывод аппаратного адреса узла
Теперь мы используем нашу функцию
my_addrsSIOCGARPioctlЛистинг 17.10. Вывод аппаратного адреса узла
//ioctl/prmac.c 1 #include "unpifi.h" 2 #include <net/if_arp.h> 3 int 4 main(int argc, char **argv) 5 { 6 int sockfd; 7 struct ifi_info *ifi; 8 unsigned char *ptr; 9 struct arpreq arpreq;10 struct sockaddr_in *sin;11 sockfd = Socket(AF_INET, SOCK_DGRAM, 0);12 for (ifi = get_ifi_info(AF_INET, 0); ifi != NULL; ifi = ifi->ifi_next) {13 printf("%s: ", Sock_ntop(ifi->ifi_addr, sizeof(struct sockaddr_in)));14 sin = (struct sockaddr_in*)&arpreq.arp_pa;15 memcpy(sin, ifi->ifi_addr, sizeof(struct sockaddr_in));16 if (ioctl(sockfd, SIOCGARP, &arpreq) < 0) {17 err_ret("ioctl SIOCGARP");18 continue;19 }20 ptr = &arpreq.arp_ha.sa_data[0];21 printf("%x:%x:%x:%x:%x:%xn", *ptr, *(ptr+1),22 *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));23 }24 exit(0);25 }12get_ifi_info13inet_ntopget_ifi_info14-19arp_paioctl
