. Назначение этих параметров — выход из группы на заданном локальном интерфейсе. С этими параметрами сокета применяются те же структуры, которые мы только что показали для присоединения к группе. Если локальный интерфейс не задан (то есть его значение равно
INADDR_ANY
для IPv4 или индекс интерфейса равен нулю для IPv6), удаляется первое совпадающее с искомым вхождение в группу.
Если процесс присоединился к группе, но не выходил из группы явно, то при закрытии сокета (либо
явном, либо по завершении процесса) вхождение в группу прекращается автоматически. Возможна ситуация, когда несколько процессов на узле присоединились к одной и той же группе, и в этом случае узел остается членом группы, пока последний процесс не выйдет из группы.
ПРИМЕЧАНИЕ
Изначально в API многоадресной передачи IPv6 использовалась константа IPV6_DROP_MEMBERSHIP, а не IPV6_LEAVE_GROUP. Во всех остальных отношениях интерфейс программирования не изменился. Описанная далее функция mcast_leave скрывает это отличие.
IP_BLOCK_SOURCE
,
MCAST_BLOCK_SOURCE
. Блокируют получение трафика через данный сокет от конкретного источника для конкретной группы и интерфейса. Если все сокеты, присоединенные к группе, заблокировали один и тот же источник, система может проинформировать маршрутизаторы о нежелательности трафика, что может повлиять на маршрутизацию многоадресного трафика в сети. Локальный интерфейс задается одним из его направленных адресов для IPv4 или индексом для независимого от версии API. Для блокирования и разблокирования источника используются две приведенные ниже структуры:
unsigned int gsr_interface; /* индекс интерфейса или 0 */
struct sockaddr_storage gsr_group; /* адрес многоадресной
передачи IPv4 или IPv6 */
struct sockaddr_storage gsr_source; /* адрес источника IPv4
или IPv6 */
};
Если локальный интерфейс задается как универсальный адрес (
INADDR_ANY
для IPv4) или как нулевой индекс IPv6, то конкретный локальный интерфейс выбирается ядром.
Запрос на блокирование источника действует только для присоединенных групп, то есть таких, которые уже были присоединены к указанному интерфейсу параметром
IP_ADD_MEMBERSHIP
,
IPV6_JOIN_GROUP
или
MCAST_JOIN_GROUP
.
IP_UNBLOCK_SOURCE
,
MCAST_UNBLOCK_SOURCE
. Разблокирование заблокированного ранее источника. Аргументы должны быть в точности те же, что и у предшествовавшего запроса
IP_BLOCK_SOURCE
или
MCAST_BLOCK_SOURCE
.
Если
локальный интерфейс задается как универсальный адрес (
INADDR_ANY
для IPv4) или как нулевой индекс IPv6, то конкретный локальный интерфейс выбирается ядром.
IP_ADD_SOURCE_MEMBERSHIР
,
MCAST_JOIN_SOURCE_GROUP
. Присоединение к группе конкретного источника на заданном локальном интерфейсе. С этим параметром используются те же структуры, что и с параметрами блокирования и разблокирования источника. Сокет не должен быть присоединен к той же группе без указания источника (параметры
IP_ADD_MEMBERSHIP
,
IPV6_JOIN_GROUP
,
MCAST_JOIN_GROUP
).
Если локальный интерфейс задается как универсальный адрес (
INADDR_ANY
для IPv4) или как нулевой индекс IPv6, то конкретный локальный интерфейс выбирается ядром.
IP_DROP_SOURCE_MEMBERSHIP
,
MCAST_LEAVE_SOURCE_GROUP
. Отключение от группы источника конкретного локального интерфейса. Используются те же структуры, что и с предыдущими параметрами сокетов. Если локальный интерфейс не указан (значение
INADDR_ANY
для IPv4 или 0 для независимого от версии API), отключается первая группа, удовлетворяющая заданным значениям.
Если процесс присоединяется к группе источника, но не отключается от нее явно, отсоединение производится автоматически при закрытии сокета (явном или также автоматическом, при завершении процесса). Несколько процессов узла могут присоединиться к одной и той же группе источника, в случае чего узел остается в группе до тех пор, пока из нее не выйдет последний процесс.
IP_MULTICAST_IF
и
IPV6_MULTICAST_IF
. Назначение этих параметров - задание интерфейса для исходящих дейтаграмм многоадресной передачи, отправленных на этом сокете. Этот интерфейс задается либо структурой
in_addr
для IPv4, либо индексом интерфейса для IPv6. Если задано значение
INADDR_ANY
для IPv4 или нулевой индекс интерфейса для IPv6, то удаляется любой интерфейс, ранее заданный этим параметром сокета, и система будет выбирать интерфейс каждый раз при отправке дейтаграммы.
Будьте внимательны, четко различая локальный интерфейс, заданный (или выбранный), когда процесс присоединяется к группе (интерфейс для получения приходящих дейтаграмм многоадресной передачи), и локальный интерфейс, заданный (или выбранный) для исходящих дейтаграмм.
ПРИМЕЧАНИЕ
Беркли-ядра выбирают интерфейс для исходящих дейтаграмм многоадресной передачи по умолчанию при помощи обычной таблицы маршрутизации IP. В ней выполняется поиск маршрута к групповому адресу получателя, после чего используется соответствующий интерфейс. Это та же технология, что используется для выбора принимающего интерфейса, если процесс не задает его в процессе присоединения к группе. При этом считается, что если для данного адреса многоадресной передачи существует маршрут (возможно, маршрут, заданный по умолчанию в таблице маршрутизации), то соответствующий интерфейс должен использоваться для ввода и вывода.