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 IPV6
45 #include "ip6.h" /* должно быть <netinet/ip6.h> */
46 #include "icmp6.h" /* должно быть <netinet/icmp6.h> */
47 #endif
1-11
rec
32-43
ping
proto
pr
main
44-47
Функция
main
pr
traceloop
Листинг 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 #endif
10 int datalen = sizeof(struct rec); /* значения по умолчанию */
11 int max_ttl = 30;
12 int nprobes = 3;
13 u_short dport = 32768 + 666;
14 int
15 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 IPV6
47 } else if (ai->ai_family == AF_INET6) {
48 pr = &proto_v6;
49 if (IN6_IS_ADDR_V4MAPPED
50 (&(((struct sockaddr_in6*)ai->ai_addr)->sin6_addr)))
51 err_quit("cannot traceroute IPv4-mapped IPv6 address");