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
В этом разделе мы приведем собственную версию программы
traceroutepingПрограмма
tracerouteВ версии IPv6 программа
traceroutePort unreachableРанние версии программы
tracerouteIP_HDRINCLIP_TTLIPV6_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 */
