UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
19-24msghdriovecrecvmsg25-37gettimeofdayproc_v4proc_v6В листинге 28.5 приведена функция
tv_subtimevalЛистинг 28.5. Функция tv_sub: вычитание двух структур timeval
//lib.tv_sub.c 1 #include "unp.h" 2 void 3 tv_sub(struct timeval *out, struct timeval *in) 4 { 5 if ((out->tv_usec -= in->tv_usec) < 0) { /* out -= in */ 6 --out->tv_sec; 7 out->tv_usec += 1000000; 8 } 9 out->tv_sec -= in->tv_sec;10 }В листинге 28.6 приведена функция
proc_v4Листинг 28.6. Функция proc_v4: обработка сообщений ICMPv4
//ping/prov_v4.c 1 #include "ping.h" 2 void 3 proc_v4(char *ptr, ssize_t len, struct msghdr *msg, struct timeval *tvrecv) 4 { 5 int hlen1, icmplen; 6 double rtt; 7 struct ip *ip; 8 struct icmp *icmp; 9 struct timeval *tvsend;10 ip = (struct ip*)ptr; /* начало IP-заголовка */11 hlen1 = ip->ip_hl << 2; /* длина IP-заголовка */12 if (ip->ip_p != IPPROTO_ICMP)13 return; /* не ICMP */14 icmp = (struct icmp*)(ptr + hlen1); /* начало ICMP-заголовка */15 if ((icmplen = len - hlen1) < 8)16 return; /* плохой пакет */17 if (icmp->icmp_type == ICMP_ECHOREPLY) {18 if (icmp->icmp_id != pid)19 return; /* это не ответ на наш ECHO_REQUEST */20 if (icmplen < 16)21 return; /* недостаточно данных */22 tvsend = (struct timeval*)icmp->icmp_data;23 tv_sub(tvrecv, tvsend);24 rtt = tvrecv->tv_sec * 1000.0 + tvrecv->tv_usec / 1000.0;25 printf("%d bytes from %s: seq=%u, ttl=%d, rtt=%.3f msn",26 icmplen, Sock_ntop_host(pr->sarecv, pr->salen),27 icmp->icmp_seq, ip->ip_ttl, rtt);28 } else if (verbose) {29 printf(" %d bytes from %s: type = %d, code = %dn",30 icmplen, Sock_ntop_host(pr->sarecv, pr->salen),31 icmp->icmp_type, icmp->icmp_code);32 }33 }10-16
Рис. 28.3. Заголовки, указатели и длина при обработке ответов ICMPv4
17-2122-27tvrecv28-32-vОбработка сообщений ICMPv6 управляется функцией
proc_v6proc_v4init_v6
