UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
На рис. 27.1 показано, что маршрут состоит из 10 адресов, но первый приведенный адрес удаляется из параметра маршрута от отправителя и становится адресом получателя, когда дейтаграмма IP покидает узел отправителя. Хотя в 40-байтовом пространстве, отведенном под данный параметр IP, хватает места только для 9 адресов (не забудьте о 3-байтовом заголовке параметра, который мы вскоре опишем), фактически в заголовке IPv4 у нас имеется 10 IP-адресов, так как к 9 адресам узлов добавляется адрес получателя.
Поле
code0x830x89lensetsockoptlenptrТеперь мы переходим к определению трех функций, с помощью которых мы инициализируем, создаем и обрабатываем параметр маршрута от отправителя. Наши функции предназначены для работы только с этим параметром. Хотя в принципе возможно объединить параметр маршрута от отправителя с другими параметрами IP (такими как параметр извещения маршрутизатора), но на практике параметры редко комбинируются. В листинге 27.1 [1] приведена функция
inet_srcrt_initЛистинг 27.1. Функция inet_srcrt_init: инициализация перед записью маршрута от отправителя
//ipopts/sourceroute.с 1 #include "unp.h" 2 #include <netinet/in_systm.h> 3 #include <netinet/ip.h> 4 static u_char *optr; /* указатель на формируемые параметры */ 5 static u_char *lenptr; /* указатель на длину параметра SRR */ 6 static int ocnt; /* количество адресов */ 7 u_char* 8 inet_srcrt_init(int type) 9 {10 optr = Malloc(44); /* NOP, код параметра. len, указатель + до 10 адресов */11 bzero(optr, 44); /* гарантирует наличие EOL на конце */12 ocnt = 0;13 *optr++ = IPOPT_NOP; /* выравнивающие NOP */14 *optr++ = type ? IPOPT_SSRR : IPOPT_LSRR;15 lenptr = optr++; /* поле длины заполняется позже */16 *optr++ = 4; /* сдвиг на первый адрес */17 return(optr - 4); /* указатель для setsockopt() */18 }10-17lensetsockoptСледующая функция,
inet_srcrt_addЛистинг 27.2. Функция inet_srcrt_add: добавление одного IPv4-адреса к маршруту от отправителя
//ipopts/sourceroute.с19 int20 inet_srcrt_add(char *hostptr)21 {22 int len;23 struct addrinfo *ai;24 struct sockaddr_in *sin;25 if (ocnt > 9)26 err_quit("too many source routes with: %s", hostptr);27 ai = Host_serv(hostptr, NULL, AF_INET, 0);28 sin = (struct sockaddr_in*)ai->ai_addr;29 memcpy(optr, &sin->sin_addr, sizeof(struct in_addr));30 freeaddrinfo(ai);31 optr += sizeof(struct in_addr);32 ocnt++;33 len = 3 + (ocnt * sizeof(struct in_addr));34 *lenptr = len;35 return(len + 1); /* размер для setsockopt() */36 }19-2025-2629-37host_servlensetsockopt
