UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
36 struct sockaddr *sarecv; /* структура sockaddr{} для получения */37 struct sockaddr *salast; /* последняя структура sockaddr{} для получения */38 struct sockaddr *sabind; /* структура sockaddr{} для связывания порта отправителя*/39 socklen_t salen; /* длина структур sockaddr{}s */40 int icmpproto; /* значение IPPROTO_xxx для ICMP */41 int ttl level; /* значение аргумента level функции setsockopt() для задания TTL */42 int ttloptname; /* значение аргумента name функции setsockopt() для задания TTL */43 } *pr;44 #ifdef IPV645 #include "ip6.h" /* должно быть <netinet/ip6.h> */46 #include "icmp6.h" /* должно быть <netinet/icmp6.h> */47 #endif1-11rec32-43pingprotoprmain44-47Функция
mainprtraceloopЛистинг 28.14. Функция main программы traceroute
//traceroute/main.c 1 #include "trace.h" 2 struct proto proto_v4 = 3 {icmpcode_v4, recv_v4, NULL, NULL, NULL, NULL, 0, 4 IPPROTO_ICMP, IPPROTO_IP, IP_TTL}; 5 #ifdef IPV6 6 struct proto proto_v6 = 7 {icmpcode_v6, recv_v6, NULL, NULL, NULL, NULL, 0, 8 IPPROTO_ICMPV6, IPPROTO_IPV6, IPV6_UNICAST_HOPS}; 9 #endif10 int datalen = sizeof(struct rec); /* значения по умолчанию */11 int max_ttl = 30;12 int nprobes = 3;13 u_short dport = 32768 + 666;14 int15 main(int argc, char **argv)16 {17 int c;18 struct addrinfo *ai;19 opterr = 0; /* чтобы функция getopt() не записывала в stderr */20 while ((с = getopt(argc, argv, "m:v")) != -1) {21 switch (c) {22 case 'm':23 if ((max_ttl = atoi(optarg)) <= 1)24 err_quit("invalid -m value");25 break;26 case 'v':27 verbose++;28 break;29 case '?':30 err_quit("unrecognized option: %c", c);31 }32 }33 if (optind != argc - 1)34 err_quit("usage: traceroute [ -m <maxttl> -v ] <hostname>");35 host = argv[optind];36 pid = getpid();37 Signal(SIGALRM, sig_alrm);38 ai = Host_serv(host, NULL, 0, 0);39 printf("traceroute to %s (%s): %d hops max, %d data bytesn",40 ai->ai_canonname,41 Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);42 max_ttl, datalen);43 /* инициализация в зависимости от протокола */44 if (ai->ai_family == AF_INET) {45 pr = &proto_v4;46 #ifdef IPV647 } else if (ai->ai_family == AF_INET6) {48 pr = &proto_v6;49 if (IN6_IS_ADDR_V4MAPPED50 (&(((struct sockaddr_in6*)ai->ai_addr)->sin6_addr)))51 err_quit("cannot traceroute IPv4-mapped IPv6 address");
