UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Листинг 28.12. Функция send_v6: построение и отправка ICMPv6-сообщения эхо-запроса
//ping/send_v6.c
1 #include "ping.h"
2 void
3 send_v6()
4 {
5 #ifdef IPV6
6 int len;
7 struct icmp6_hdr *icmp6;
8 icmp6 = (struct icmp6_hdr*)sendbuf,
9 icmp6->icmp6_type = ICMP6_ECHO_REQUEST;
10 icmp6->icmp6_code = 0;
11 icmp6->icmp6_id = pid;
12 icmp6->icmp6_seq = nsent++;
13 memset((icmp6 + 1), 0xa5, datalen); /* заполнение по шаблону */
14 Gettimeofday((struct timeval*)(icmp6 + 1), NULL);
15 len = 8 + datalen; /* 8-байтовый заголовок ICMPv6 */
16 Sendto(sockfd, sendbuf, len, 0, pr->sasend, pr->salen);
17 /* ядро вычисляет и сохраняет контрольную сумму само */
18 #endif /* IPV6 */
19 }
28.6. Программа traceroute
В этом разделе мы приведем собственную версию программы
traceroute
ping
Программа
traceroute
В версии IPv6 программа
traceroute
Port unreachable
Ранние версии программы
traceroute
IP_HDRINCL
IP_TTL
IPV6_UNICAST_HOPS
В листинге 28.13 приведен заголовочный файл t
race.h
Листинг 28.13. Заголовочный файл trace.h
//traceroute/trace.h
1 #include "unp.h"
2 #include <netinet/in_systm.h>
3 #include <netinet/ip.h>
4 #include <netinet/ip_icmp.h>
5 #include <netinet/udp.h>
6 #define BUFSIZE 1500
7 struct rec { /* структура данных UDP */
8 u_short rec_seq; /* порядковый номер */
9 u_short rec_ttl; /* значение TTL, с которым пакет отправляется */
10 struct timeval rec_tv; /* время отправки пакета */
11 };
12 /* глобальные переменные */
13 char recvbuf[BUFSIZE];
14 char sendbuf[BUFSIZE];
15 int datalen; /* размер данных в байтах после заголовка ICMP */
16 char *host;
17 u_short sport, dport;
18 int nsent; /* добавляет 1 для каждого вызова sendto() */
19 pid_t pid; /* идентификатор нашего процесса PID */
20 int probe, nprobes;
21 int sendfd, recvfd; /* посылает на сокет UDP. читает на
символьном сокете ICMP */
22 int ttl, max_ttl;
23 int verbose;
24 /* прототипы функций */
25 char *icmpcode_v4(int);
26 char *icmpcode_v6(int);
27 int recv_v4(int. struct timeval*);
28 int recv_v6(int. struct timeval*);
29 void sig_alrm(int);
30 void traceloop(void);
31 void tv_sub(struct timeval*, struct timeval*);
32 struct proto {
33 char *(*icmpcode)(int);
34 int (*recv)(int. struct timeval*);
35 struct sockaddr *sasend; /* структура sockaddr{} для отправки.
получена из getaddrinfo */