Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

Таблица 21.3. Параметры сокета, определяющие членство в группах многоадресной передачи

Параметр Тип данных Описание
IP_ADD_MEMBERSHIP struct ip_mreq Присоединение к группе многоадресной передачи
IP_DROP_MEMBERSHIP struct ip_mreq Отсоединение от группы многоадресной передачи
IP_BLOCK_SOURCE struct ip_mreq_source Блокирование источника из группы, к которой выполнено присоединение
IP_UNBLOCK_SOURCE struct ip_mreq_source Разблокирование ранее заблокированного источника
IP_ADD_SOURCE_MEMBERSHIP struct ip_mreq_source Присоединение к группе источника
IP_DROP_SOURCE_MEMBERSHIP struct ip_mreq_source Отсоединение от группы источника
IPV6_JOIN_GROUP struct ipv6_mreq Присоединение к группе многоадресной передачи
IPV6_LEAVE_GROUP struct ipv6_mreq Отсоединение от группы многоадресной передачи
MCAST_JOIN_GROUP struct group_req Присоединение к группе многоадресной передачи
MCAST_LEAVE_GROUP struct group_req Отсоединение от группы многоадресной передачи
MCAST_BLOCK_SOURCE struct group_source_req Блокирование источника из группы, к которой выполнено присоединение
MCAST_UNBLOCK_SOURCE struct group_source_req Разблокирование ранее заблокированного источника
MCAST_JOIN_SOURCE_GROUP struct group_source_req Присоединение к группе источника
MCAST_LEAVE_SOURCE_GROUP struct group_source_req Отсоединение от группы источника
ПРИМЕЧАНИЕ

Параметры IPv4 TTL и закольцовки получают аргумент типа u_char, в то время как IPv6-параметры предела транзитных узлов и закольцовки получают аргументы соответственно типа int и u_int. Распространенная ошибка программирования с параметрами многоадресной передачи IPv4 — вызов функции setsockopt с аргументом типа int для задания TTL или закольцовки (что не разрешается [128, с. 354–355]), поскольку большинство других параметров сокетов, представленных в табл. 7.1, имеют целочисленные аргументы. Изменения, внесенные в IPv6, должны уменьшить вероятность ошибок.

Теперь мы опишем каждый из девяти параметров сокетов более подробно. Обратите внимание, что эти девять параметров концептуально идентичны в IPv4 и IPv6 — различаются только их названия и типы аргументов.

IP_ADD_MEMBERSHIP
,
IPV6_JOIN_GROUP
,
MCAST_JOIN_GROUP
. Назначение этих параметров — присоединение к группе на заданном локальном интерфейсе. Мы задаем локальный интерфейс одним из его направленных адресов для IPv4 или индексом интерфейса для IPv6. Следующие три структуры используются при присоединении к группе или при отсоединении от нее:

struct ip_mreq {

struct in_addr imr_multiaddr; /* IPv4-адрес многоадресной

передачи класса D */

struct in_addr imr_interface; /* IPv4-адрес локального

интерфейса */

};

struct ipv6_mreq {

struct in6_addr ipv6mr_multiaddr; /* IPv6-адрес многоадресной

передачи */

unsigned int ipv6mr_interface; /* индекс интерфейса или 0 */

};

struct group_req {

unsigned int gr_interface; /* индекс интерфейса или 0 */

struct sockaddr_storage gr_group; /* адрес многоадресной передачи

IPv4 или IPv6 */

};

Если локальный интерфейс задается как универсальный адрес (

INADDR_ANY
для IPv4) или как нулевой индекс IPv6, то конкретный локальный интерфейс выбирается ядром.

Мы говорим, что узел принадлежит к данной группе на данном интерфейсе, если один или более процессов в настоящий момент принадлежат к этой группе на этом интерфейсе.

Сокет может быть присоединен к нескольким группам, но к каждой группе должен быть присоединен уникальный адрес или уникальный интерфейс. Это свойство можно использовать на узле с несколькими сетевыми интерфейсами: создается один сокет, которому присваивается один адрес многоадресной передачи, но благодаря наличию разных интерфейсов этот сокет может быть присоединен к разным группам.

Вспомните из табл. 21.1, что частью адреса многоадресной передачи IPv6 является поле области действия. Как мы отмечали, адреса многоадресной передачи IPv6, отличающиеся только областью действия, являются различными. Следовательно, если реализация протокола синхронизации времени (network time protocol, NTP) хочет получать все пакеты NTP независимо от их области действия, она должна будет присоединиться к адресу

ff01:101
(локальный в пределах узла),
ff02:101
(локальный в пределах физической сети),
ff05:101
(локальный в пределах сайта),
ff08:101
(локальный в пределах организации) и
ff0e:101
(глобальный). Все присоединения могут выполняться на одном сокете. Можно установить параметр сокета
IPV6_PKTINFO
(см. раздел 22.8), чтобы функция recvmsg возвращала адрес получателя каждой дейтаграммы.

  • Читать дальше
  • 1
  • ...
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: