UNIX: разработка сетевых приложений
struct ip_mreq_source {struct in_addr imr_multiaddr; /* IPv4-адрес многоадреснойпередачи класса D */struct in_addr imr_sourceaddr; /* IPv4-адрес источника */struct in_addr imr_interface; /* IPv4-адрес локальногоинтерфейса */};struct group_source_req {unsigned int gsr_interface; /* индекс интерфейса или 0 */struct sockaddr_storage gsr_group; /* адрес многоадреснойпередачи IPv4 или IPv6 */struct sockaddr_storage gsr_source; /* адрес источника IPv4или IPv6 */};Если локальный интерфейс задается как универсальный адрес (
для IPv4) или как нулевой индекс IPv6, то конкретный локальный интерфейс выбирается ядром.INADDR_ANYЗапрос на блокирование источника действует только для присоединенных групп, то есть таких, которые уже были присоединены к указанному интерфейсу параметром
,IP_ADD_MEMBERSHIPилиIPV6_JOIN_GROUP.MCAST_JOIN_GROUP■
,IP_UNBLOCK_SOURCE. Разблокирование заблокированного ранее источника. Аргументы должны быть в точности те же, что и у предшествовавшего запросаMCAST_UNBLOCK_SOURCEилиIP_BLOCK_SOURCE.MCAST_BLOCK_SOURCEЕсли локальный интерфейс задается как универсальный адрес (
для IPv4) или как нулевой индекс IPv6, то конкретный локальный интерфейс выбирается ядром.INADDR_ANY■
,IP_ADD_SOURCE_MEMBERSHIР. Присоединение к группе конкретного источника на заданном локальном интерфейсе. С этим параметром используются те же структуры, что и с параметрами блокирования и разблокирования источника. Сокет не должен быть присоединен к той же группе без указания источника (параметрыMCAST_JOIN_SOURCE_GROUP,IP_ADD_MEMBERSHIP,IPV6_JOIN_GROUP).MCAST_JOIN_GROUPЕсли локальный интерфейс задается как универсальный адрес (
для IPv4) или как нулевой индекс IPv6, то конкретный локальный интерфейс выбирается ядром.INADDR_ANY■
,IP_DROP_SOURCE_MEMBERSHIP. Отключение от группы источника конкретного локального интерфейса. Используются те же структуры, что и с предыдущими параметрами сокетов. Если локальный интерфейс не указан (значениеMCAST_LEAVE_SOURCE_GROUPдля IPv4 или 0 для независимого от версии API), отключается первая группа, удовлетворяющая заданным значениям.INADDR_ANYЕсли процесс присоединяется к группе источника, но не отключается от нее явно, отсоединение производится автоматически при закрытии сокета (явном или также автоматическом, при завершении процесса). Несколько процессов узла могут присоединиться к одной и той же группе источника, в случае чего узел остается в группе до тех пор, пока из нее не выйдет последний процесс.
■
иIP_MULTICAST_IF. Назначение этих параметров - задание интерфейса для исходящих дейтаграмм многоадресной передачи, отправленных на этом сокете. Этот интерфейс задается либо структуройIPV6_MULTICAST_IFдля IPv4, либо индексом интерфейса для IPv6. Если задано значениеin_addrдля IPv4 или нулевой индекс интерфейса для IPv6, то удаляется любой интерфейс, ранее заданный этим параметром сокета, и система будет выбирать интерфейс каждый раз при отправке дейтаграммы.INADDR_ANYБудьте внимательны, четко различая локальный интерфейс, заданный (или выбранный), когда процесс присоединяется к группе (интерфейс для получения приходящих дейтаграмм многоадресной передачи), и локальный интерфейс, заданный (или выбранный) для исходящих дейтаграмм.
ПРИМЕЧАНИЕБеркли-ядра выбирают интерфейс для исходящих дейтаграмм многоадресной передачи по умолчанию при помощи обычной таблицы маршрутизации IP. В ней выполняется поиск маршрута к групповому адресу получателя, после чего используется соответствующий интерфейс. Это та же технология, что используется для выбора принимающего интерфейса, если процесс не задает его в процессе присоединения к группе. При этом считается, что если для данного адреса многоадресной передачи существует маршрут (возможно, маршрут, заданный по умолчанию в таблице маршрутизации), то соответствующий интерфейс должен использоваться для ввода и вывода.
■
иIP_MULTICAST_TTL. Назначение этих параметров - установка значения поля TTL в случае IPv4 или предельного количества транзитных узлов в случае IPv6 для исходящих дейтаграмм многоадресной передачи. По умолчанию значение обоих параметров равно 1, что ограничивает дейтаграмму локальной подсетью.IPV6_MULTICAST_HOPS■
иIP_MULTICAST_LOOP. Назначение этих параметров - включение или отключение локальной закольцовки для дейтаграмм многоадресной передачи. По умолчанию закольцовка включена: копия каждой дейтаграммы многоадресной передачи, посылаемой процессом на узле, будет отправлена обратно на этот узел и обработана им, как любая другая полученная дейтаграмма, если узел принадлежит данной группе на исходящем интерфейсе.IPV6_MULTICAST_LOOPЭто аналогично широковещательной передаче, где мы видели, что широковещательные сообщения, посылаемые на узле, также обрабатываются на нем, как полученные дейтаграммы (см. рис. 20.3). (Но в случае широковещательной передачи нет возможности отключить закольцовку.) Это значит, что если процесс входит в ту группу, которой он отправляет дейтаграммы, он будет получать свои собственные передачи.
ПРИМЕЧАНИЕОписываемая здесь закольцовка является внутренней и выполняется на уровне IP или выше. Если интерфейс получает копии своих передач, RFC 1112 [26] требует, чтобы драйвер игнорировал эти копии. В этом документе также утверждается, что параметр закольцовки по умолчанию включен «в целях оптимизации производительности для протоколов верхнего уровня, которые ограничивают членство в группе до одного процесса на узел (например, маршрутизирующих протоколов)».
Первые шесть пар параметров сокетов (
,ADD_MEMBERSHIP/JOIN_GROUP,DROP_MEMBERSHIP/LEAVE_GROUP,BLOCK_SOURCE,UNBLOCK_SOURCE,ADD_SOURCE_MEMBERSHIP/JOIN_SOURCE_GROUP) влияют на получение дейтаграмм многоадресной передачи, в то время как последние три пары параметров влияют на отправку дейтаграмм многоадресной передачи (интерфейс для исходящих сообщений, TTL или предел количества транзитных узлов, закольцовка). Ранее мы отмечали, что для отправки дейтаграммы многоадресной передачи ничего особенного не требуется. Если ни один параметр сокетов многоадресной передачи не задан перед отправкой дейтаграммы, интерфейс для исходящей дейтаграммы будет выбран ядром, TTL или предел количества транзитных узлов будут равны 1, а копия отправленной дейтаграммы будет посылаться обратно (то есть будет включена закольцовка).DROP_SOURCE_MEMBERSHIP/LEAVE_SOURCE_GROUP