UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
31 goto clienterr;32 }33 }34 Write(unixfd, "1", 1); /* сообщение клиенту об успехе */35 Close(recvfd); /* работа с UDP-сокетом клиента завершена */36 return(--nready);37 clienterr:38 Write(unixfd, "0", 1); /* сообщение клиенту об ошибке */39 clientdone:40 Close(unixfd);41 if (recvfd >= 0)42 Close(recvfd);43 FD_CLR(unixfd, &allset);44 client[i].connfd = -1;45 return(--nready);46 }21-25getsocknamesockaddr_storage26-33clientsock_bind_wild34"1"35close37-45selectconnfdclientФункция
readable_v4Листинг 28.29. Обработка полученных дейтаграмм ICMPv4, первая часть
//icmpd/readable_v4.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 int 7 readable_v4(void) 8 { 9 int i, hlen1, hlen2, icmplen, sport;10 char buf[MAXLINE];11 char srcstr[INET_ADDRSTRLEN], dststr[INET_ADDRSTRLEN];12 ssize_t n;13 socklen_t len;14 struct ip *ip, *hip;15 struct icmp *icmp;16 struct udphdr *udp;17 struct sockaddr_in from, dest;18 struct icmpd_err icmpd_err;19 len = sizeof(from);20 n = Recvfrom(fd4, buf, MAXLINE, 0, (SA*)&from, &len);21 printf("%d bytes ICMPv4 from %s:", n, Sock_ntop_host((SA*)&from, len));22 ip = (struct ip*)buf; /* начало IP-заголовка */23 hlen1 = ip->ip_hl << 2; /* длина IP-заголовка */24 icmp = (struct icmp*)(buf + hlen1); /* начало ICMP-заголовка */25 if ((icmplen = n - hlen1) < 8)26 err_quit("icmplen (%d) < 8", icmplen);27 printf(" type = %d, code = %dn", icmp->icmp_type, icmp->icmp_code);Функция выводит некоторую информацию о каждом получаемом сообщении ICMP. Это было сделано для отладки при разработке демона, и вывод управляется аргументом командной строки.
В листинге 28.30 приведена вторая часть функции
readable_v4Листинг 28.30. Обработка полученных дейтаграмм ICMPv4, вторая часть
//icmpd/readable_v4.c28 if (icmp->icmp_type == ICMP_UNREACH ||29 icmp->icmp_type ==ICMP_TIMXCEED ||30 icmp->icmp_type == ICMP_SOURCEQUENCH) {31 if (icmplen < 8 + 20 + 8)32 err_quit("icmplen (%d) < 8 + 20 + 8, icmplen);33 hip = (struct ip*)(buf + hlen1 + 8);34 hlen2 = hip->ip_hl << 2;35 printf("tsrcip = %s, dstip = %s, proto = %dn",36 Inet_ntop(AF_INET, &hip->ip_src, srcstr, sizeof(srcstr)),37 Inet_ntop(AF_INET, &hip->ip_dst, dststr, sizeof(dststr)),38 hip->ip_p);
