UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Когда полученный маршрут от отправителя возвращается приложению функцией
getsockopt
Рис. 27.2. Формат параметра маршрута от отправителя, возвращаемого функцией getsockopt
В первую очередь, мы можем отметить, что порядок следования адресов изменен ядром на противоположный относительно полученного маршрута от отправителя. Имеется в виду следующее: если в полученном маршруте содержались адреса А, В, С и D в указанном порядке, то под противоположным порядком подразумевается следующий: D, С, В, А. Первые 4 байта содержат первый IP-адрес из списка, затем следует однобайтовый параметр NOP (для выравнивания), затем — 3-байтовый заголовок параметра маршрута от отправителя, и далее остальные IP-адреса. После 3-байтового заголовка может следовать до 9 IP-адресов, и максимальное значение поля
lengetsockoptФормат, приведенный на рис. 27.2, определен в заголовочном файле <netinet/ip_var.h> в виде следующей структуры:
#define MAX_IPOPTLEN 40struct ipoption { struct in_addr ipopt_dst; /* адрес первого получателя */ char ipopt_list[MAX_IPOPTLEN]; /* соответствующие параметры */};В листинге 27.3 мы анализируем эти данные, не используя указанную структуру.
Возвращаемый формат отличается от того, который был передан функции
setsockoptlengetsockoptsetsockoptСледующей из рассматриваемых нами функций, связанных с параметром маршрутизации, полученный маршрут от отправителя передается в формате, показанном на рис. 27.2. Затем она выводит соответствующую информацию. Эту функцию
inet_srtcrt_printЛистинг 27.3. Функция inet_srtcrt_print: вывод полученного маршрута от отправителя
//ipopts/sourceroute.c37 void38 inet_srcrt_print(u_char *ptr, int len)39 {40 u_char c;41 char str[INET_ADDRSTRLEN];42 struct in_addr hop1;43 memcpy(&hop1, ptr, sizeof(struct in_addr));44 ptr += sizeof(struct in_addr);45 while ((c = *ptr++) == IPOPT_NOP); /* пропуск параметров NOP */46 if (с == IPOPT_LSRR)47 printf("received LSRR: ");48 else if (c == IPOPT_SSRR)49 printf("received SSRR: ");50 else {51 printf("received option type %dn", c);52 return;53 }54 printf("%s ", Inet_ntop(AF_INET, &hop1, str, sizeof(str)));55 len = *ptr++ - sizeof(struct in_addr); /* вычитаем адрес получателя */56 ptr++; /* пропуск указателя */57 while (len > 0) {58 printf("%s ", Inet_ntop(AF_INET, ptr, str, sizeof(str)));59 ptr += sizeof(struct in_addr);60 len -= sizeof(struct in_addr);61 }62 printf("n");63 }43-4546-62codelenptrПример
Теперь мы модифицируем наш эхо-сервер TCP таким образом, чтобы выводить полученный маршрут от отправителя, а эхо-клиент TCP — так, чтобы маршрут от отправителя можно было задавать. В листинге 27.4 показан код эхо-клиента TCP.
Листинг 27.4. Эхо-клиент TCP, задающий маршрут от отправителя
//ipopts/tcpcli01.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int c, sockfd, len = 0; 6 u_char *ptr = NULL; 7 struct addrinfo *ai; 8 if (argc < 2) 9 err_quit("usage: tcpcli01 [ -[gG] <hostname> ... ] <hostname>");10 opterr = 0; /* отключаем запись сообщений getopt() в stderr */
