UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
39 if (hip->ip_p == IPPROTO_UDP) {40 udp = (struct udphdr*)(buf + hlen1 + 8 + hlen2);41 sport = udp->uh_sport;42 /* поиск доменного сокета клиента, отправка заголовка */43 for (i = 0; i <= maxi; i++) {44 if (client[i].connfd >= 0 &&45 client[i].family == AF_INET &&46 client[i].lport == sport) {47 bzero(&dest, sizeof(dest));48 dest.sin_family = AF_INET;49 #ifdef HAVE_SOCKADDR_SA_LEN50 dest.sin_len = sizeof(dest);51 #endif52 memcpy(&dest.sin_addr, &hip->ip_dst,53 sizeof(struct in_addr));54 dest.sin_port = udp->uh_dport;55 icmpd_err.icmpd_type = icmp->icmp_type;56 icmpd_err.icmpd_code = icmp->icmp_code;57 icmpd_err.icmpd_len = sizeof(struct sockaddr_in);58 memcpy(&icmpd_err.icmpd_dest, &dest, sizeof(dest));59 /* преобразование кода и типа ICMP в значение errno */60 icmpd_err.icmpd_errno = EHOSTUNREACH; /* по умолчанию */61 if (icmp->icmp_type == ICMP_UNREACH) {62 if (icmp->icmp_code == ICMP_UNREACH_PORT)63 icmpd_err.icmpd_errno = ECONNREFUSED;64 else if (icmp->icmp_code == ICMP_UNREACH_NEEDFRAG)65 icmpd_err.icmpd_errno = EMSGSIZE;66 }67 Write(client[i].connfd, &icmpd_err, sizeof(icmpd_err));68 }69 }70 }71 }72 return(--nready);73 }29-3134-42hip43-55client56-70icmpd_errerrnoОшибки ICMPv6 обрабатываются функцией
readable_v6Листинг 28.31. Обработка полученной дейтаграммы ICMPv6, первая часть
//icmpd/readable_v6.c 1 #include "icmpd.h" 2 #include <netinet/in_systm.h> 3 #include <netinet/ip.h> 4 #include <netinet/ip_icmp.h> 5 #include <netinet/udp.h> 6 #ifdef IPV6 7 #include <netinet/ip6.h> 8 #include <netinet/icmp6.h> 9 #endif10 int11 readable_v6(void)12 {13 #ifdef IPV614 int i, hlen2, icmp6len, sport;15 char buf[MAXLINE];16 char srcstr[INET6_ADDRSTRLEN], dststr[INET6_ADDRSTRLEN];17 ssize_t n;18 socklen_t len;19 struct ip6_hdr *ip6, *hip6;20 struct icmp6_hdr *icmp6;21 struct udphdr *udp;22 struct sockaddr_in6 from, dest;23 struct icmpd_err icmpd_err;24 len = sizeof(from);25 n = Recvfrom(fd6, buf, MAXLINE, 0, (SA*)&from, &len);26 printf("%d bytes ICMPv6 from %s:", n, Sock_ntop_host((SA*)&from, len));27 icmp6 = (struct icmp6_hdr*)buf; /* начало заголовка ICMPv6 */28 if ((icmp6len = n) < 8)29 err_quit("icmp6len (%d) < 8", icmp6len);30 printf(" type = %d, code = %dn", icmp6->icmp6_type, icmp6->icmp6_code);Вторая часть функции
readable_v6icmpd_err
