Если процесс присоединился к группе, но не выходил из группы явно, то при закрытии сокета (либо явном, либо по завершении процесса) вхождение в группу прекращается автоматически. Возможна ситуация, когда несколько процессов на узле присоединились к одной и той же группе, и в этом случае узел остается членом группы, пока последний процесс не выйдет из группы.
ПРИМЕЧАНИЕ
Изначально в API многоадресной передачи IPv6 использовалась константа IPV6_DROP_MEMBERSHIP, а не IPV6_LEAVE_GROUP. Во всех остальных отношениях интерфейс программирования не изменился. Описанная далее функция mcast_leave скрывает это отличие.
■ IP_BLOCK_SOURCE
, MCAST_BLOCK_SOURCE
. Блокируют получение трафика через данный сокет от конкретного источника для конкретной группы и интерфейса. Если все сокеты, присоединенные к группе, заблокировали один и тот же источник, система может проинформировать маршрутизаторы о нежелательности трафика, что может повлиять на маршрутизацию многоадресного трафика в сети. Локальный интерфейс задается одним из его направленных адресов для IPv4 или индексом для независимого от версии API. Для блокирования и разблокирования источника используются две приведенные ниже структуры:
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 */
};
Если локальный интерфейс задается как универсальный адрес ( 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, то удаляется любой интерфейс, ранее заданный этим параметром сокета, и система будет выбирать интерфейс каждый раз при отправке дейтаграммы.
Будьте внимательны, четко различая локальный интерфейс, заданный (или выбранный), когда процесс присоединяется к группе (интерфейс для получения приходящих дейтаграмм многоадресной передачи), и локальный интерфейс, заданный (или выбранный) для исходящих дейтаграмм.
Читать дальше
Конец ознакомительного отрывка
Купить книгу