UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Листинг 28.32. Обработка полученной дейтаграммы ICMPv6, вторая часть
//icmpd/readable_v6.c31 if (icmp6->icmp6_type == ICMP6_DST_UNREACH ||32 icmp6->icmp6_type == ICMP6_PACKET_TOO_BIG ||33 icmp6->icmp6_type == ICMP6_TIME_EXCEEDED) {34 if (icmp6len < 8+8)35 err_quit("icmp6len (%d) < 8 + 8", icmp6len);36 hip6 = (struct ip6_hdr*)(buf + 8);37 hlen2 = sizeof(struct ip6_hdr);38 printf("tsrcip = %s, dstip = %s, next hdr = %dn",39 Inet_ntop(AF_INET6, &hip6->ip6_src, srcstr, sizeof(srcstr)),40 Inet_ntop(AF_INET6, &hip6->ip6_dst, dststr, sizeof(dststr)),41 hip6->ip6_nxt);42 if (hip6->ip6_nxt == IPPROTO_UDP) {43 udp = (struct udphdr*)(buf + 8 + hlen2);44 sport = udp->uh_sport;45 /* поиск доменного сокета клиента, отправка заголовков */46 for (i = 0; i <= maxi; i++) {47 if (client[i].connfd >= 0 &&48 client[i].family == AF_INET6 &&49 client[i].lport == sport) {50 bzero(&dest, sizeof(dest));51 dest.sin6_family = AF_INET6;52 #ifdef HAVE_SOCKADDR_SA_LEN53 dest.sin6_len = sizeof(dest);54 #endif55 memcpy(&dest.sin6_addr, &hip6->ip6_dst,56 sizeof(struct in6_addr));57 dest.sin6_port = udp->uh_dport;58 icmpd_err.icmpd_type = icmp6->icmp6_type;59 icmpd_err.icmpd_code = icmp6->icmp6_code;60 icmpd_err.icmpd_len = sizeof(struct sockaddr_in6);61 memcpy(&icmpd_err.icmpd_dest, &dest, sizeof(dest));62 /* преобразование типа и кода ICMPv6 к значению errno */63 icmpd_err.icmpd_errno = EHOSTUNREACH; /* по умолчанию */64 if (icmp6->icmp6_type == ICMP6_DST_UNREACH &&65 icmp6->icmp6_code ICMP6_DST_UNREACH_NOPORT)66 icmpd_err.icmpd_errno = ECONNREFUSED;67 if (icmp6->icmp6_type == ICMP6_PACKET_TOO_BIG)68 icmpd_err.icmpd_errno = EMSGSIZE;69 Write(client[i].connfd, &icmpd_err, sizeof(icmpd_err));70 }71 }72 }73 }74 return(--nready);75 #endif76 }28.8. Резюме
Символьные сокеты обеспечивают три возможности:
1. Чтение и запись пакетов ICMPv4, IGMPv4 и ICMPv6.
2. Чтение и запись IP-дейтаграммы с полем протокола, которое не обрабатывается ядром.
3. Формирование своих собственных заголовков IPv4, обычно используемых в диагностических целях (или, к сожалению, хакерами).
Два традиционных диагностических средства — программы
pingtracerouteicmpdУпражнения
1. В этой главе говорилось, что почти все поля заголовка IPv6 и все дополнительные заголовки доступны приложению через параметры сокета или вспомогательные данные. Какая информация из дейтаграммы IPv6 не доступна приложению?
2. Что произойдет в листинге 28.30, если по какой-либо причине клиент перестанет производить считывание из своего доменного сокета Unix и демон
icmpd3. Если задать нашей программе
pingSO_BROADCAST4. Что произойдет с программой
pingГлава 29
Доступ к канальному уровню
29.1. Введение
В настоящее время большинство операционных систем позволяют приложению получать доступ к канальному уровню. Это подразумевает следующие возможности:
1. Отслеживание пакетов, принимаемых на канальном уровне, что, в свою очередь, позволяет запускать такие программы, как
tcpdumpЭта возможность не так полезна в коммутируемых сетях, которые получили широкое распространение в последнее время. Дело в том, что коммутатор пропускает трафик на конкретный порт только в том случае, если этот трафик адресован конкретному устройству или устройствам, подключенным к этому порту, каким бы трафик ни был: направленным, широковещательным или многоадресным. Для того чтобы получать трафик, передаваемый через другие порты коммутатора, нужно сначала переключить свой порт коммутатора в режим контроля (monitor mode или port mirroring). Заметьте, что многие устройства, которые обычно не считают коммутаторами, на самом деле являются таковыми. Например, двухскоростной концентратор 10/100 обычно является двухпортовым коммутатором: один порт для сетей, работающих на 100 Мбит/с, другой — для сетей на 10 Мбит/с.
