Уильям Стивенс - UNIX: разработка сетевых приложений
- Название:UNIX: разработка сетевых приложений
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:5-94723-991-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Если у ядра есть IP-дейтаграмма для пересылки символьному сокету, в поисках подходящих сокетов проверяются все символьные сокеты всех процессов. Копия IP-дейтаграммы доставляется каждому подходящему сокету. Для каждого символьного сокета выполняются три перечисленных ниже проверки, и только в том случае, если все три проверки дают положительный результат, дейтаграмма направляется данному сокету.
1. Если при создании символьного сокета определено ненулевое значение protocol
(третий аргумент функции socket
), то значение поля протокола полученной дейтаграммы должно совпадать с этим ненулевым значением, иначе дейтаграмма не будет доставлена на данный сокет.
2. Если локальный IP-адрес связан с символьным сокетом функцией bind
, IP-адрес получателя в полученной дейтаграмме должен совпадать с этим адресом, иначе дейтаграмма не посылается данному сокету.
3. Если для символьного сокета был определен внешний адрес с помощью функции connect
, IP-адрес отправителя в полученной дейтаграмме должен совпадать с этим адресом, иначе дейтаграмма не посылается данному сокету.
Следует отметить, что если символьный сокет создан с нулевым значением аргумента protocol
и не вызывается ни функция bind
, ни функция connect
, то сокет получает копии всех дейтаграмм, которые ядро направляет символьным сокетам.
Дейтаграммы IPv4 всегда передаются через символьные сокеты целиком, вместе с заголовками. В версии IPv6 символьному сокету передается все, кроме дополнительных заголовков (см., например, рис. 28.4 и 28.6).
В заголовке IPv4, передаваемом приложению, для ip_len, ip_off и ip_id установлен порядок байтов узла, а все остальные ноля имеют порядок байтов сети. В системе Linux все поля остаются в сетевом порядке байтов.
Как уже говорилось, интерфейс символьных сокетов определяется таким образом, чтобы работа со всеми протоколами, в том числе и не обрабатываемыми ядром, осуществлялась одинаково. Поэтому содержимое полей зависит от ядра операционной системы.
В предыдущем разделе мы отметили, что все ноля символьного сокета IPv6 остаются в сетевом порядке байтов.
Фильтрация по типу сообщений ICMPv6
Символьный сокет ICMPv4 получает большинство сообщений ICMPv4, полученных ядром. Но ICMPv6 является расширением ICMPv4, включающим функциональные возможности ARP и IGMP (см. раздел 2.2). Следовательно, символьный сокет ICMPv6 потенциально может принимать гораздо больше пакетов по сравнению с символьным сокетом ICMPv4. Но большинство приложений, использующих символьные сокеты, заинтересованы только в небольшом подмножестве всех ICMP-сообщений.
Для уменьшения количества пакетов, передаваемых от ядра к приложению через символьный ICMPv6-сокет, предусмотрен фильтр, связанный с приложением. Фильтр объявляется с типом данных struct icmp6_filter
, который определяется в заголовочном файле . Для установки и получения текущего ICMPv6-фильтра для символьного сокета ICMPv6 используются функции setsockopt
и getsockopt
с аргументом level
, равным IPPROTO_ICMPV6
, и аргументом optname
, равным ICMP6_FILTER
.
Со структурой icmp6_filter
работают шесть макросов.
#include
void ICMP6_FILTER_SETPASSALL(struct icmp6_filter * filt );
void ICMP6_FILTER_SETBLOCKALL(struct icmp6_filter * filt );
void ICMP6_FILTER_SETPASS(int msgtype , struct icmp6_filter * filt );
void ICMP6_FILTER_SETBLOCK(int msgtype , struct icmp6_filter * filt );
int ICMP6_FILTER_WILLPASS(int msgtype , const struct icmp6_filter * filt );
int ICMP6_FILTER_WILLBLOCK(int msgtype , const struct icmp6_filter * filt );
Все возвращают: 1, если фильтр пропускает (блокирует) сообщение данного типа, 0 в противном случае
Аргумент filt
всех макрокоманд является указателем на переменную icmp6_filter
, изменяемую первыми четырьмя макрокомандами и проверяемую последними двумя. Аргумент msgtype
является значением в интервале от 0 до 255, определяющим тип ICMP-сообщения.
Макрокоманда SETPASSALL
указывает, что все типы сообщений должны пересылаться приложению, а макрокоманда SETBLOCKALL
— что никакие сообщения не должны посылаться приложениям. По умолчанию при создании символьного сокета ICMPv6 подразумевается, что все типы ICMP-сообщений пересылаются приложению.
Макрокоманда SETPASS
определяет конкретный тип сообщений, который должен пересылаться приложению, а макрокоманда SETBLOCK
блокирует один конкретный тип сообщений. Макрокоманда WILLPASS
возвращает значение 1, если определенный тип пропускается фильтром. Макрокоманда WILLBLOCK
возвращает значение 1, если определенный тип блокирован фильтром, и нуль в противном случае.
В качестве примера рассмотрим приложение, которое будет получать только ICMPv6-извещения маршрутизатора:
struct icmp6_filter myfilt;
fd = Socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
ICMP6_FILTER_SETBLOCKALL(&myfilt);
ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &myfilt);
Setsockopt(fd, IPPROTO_ICMPV6, ICMP6_FILTER, &myfilt, sizeof(myfilt));
Сначала мы блокируем все типы сообщений (поскольку по умолчанию все типы сообщений пересылаются), а затем разрешаем пересылать только извещения маршрутизатора. Несмотря на то, что мы используем фильтр, приложение должно быть готово к получению всех типов пакетов ICMPv6, потому что любые пакеты ICMPv6, полученные между вызовами socket
и setsockopt
, будут добавлены в очередь на сокете. Параметр ICMP6_FILTER
— лишь средство оптимизации условий функционирования приложения.
28.5. Программа ping
В данном разделе приводится версия программы ping
, работающая как с IPv4, так и с IPv6. Вместо того чтобы представить известный доступный исходный код, мы разработали оригинальную программу, и сделано это по двум причинам. Во-первых, свободно доступная программа ping
страдает общей болезнью программирования, известной как «ползучий улучшизм» (стремление к постоянным ненужным усложнениям программы в погоне за мелкими улучшениями): она поддерживает 12 различных параметров. Наша цель при исследовании программы ping
в том, чтобы понять концепции и методы сетевого программирования и не быть при этом сбитыми с толку ее многочисленными параметрами. Наша версия программы ping
поддерживает только один параметр и занимает в пять раз меньше места, чем общедоступная версия. Во-вторых, общедоступная версия работает только с IPv4, а нам хочется показать версию, поддерживающую также и IPv6.
Действие программы ping предельно просто: по некоторому IP-адресу посылается эхо-запрос ICMP, и этот узел отвечает эхо-ответом ICMP. Оба эти сообщения поддерживаются в обеих версиях — и в IPv4, и в IPv6. На рис. 28.1 приведен формат ICMP-сообщений.

Рис. 28.2. Обзор функций программы ping
Читать дальшеИнтервал:
Закладка: