Я работаю над кодом, который присоединяется к группе многоадресной рассылки с помощью соединения IGMP
struct ip_mreq mreq;
inet_pton(AF_INET, group, &mreq.imr_multiaddr.s_addr);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) < 0)
throw std::runtime_error(perror("setsockopt(IP_ADD_MEMBERSHIP)"));
Когда приложение закрывается, оно закрывает сокет
close(fd);
Тем не менее, он не выполняет IP_DROP_MEMBERSHIP
,
Да, Linux поддерживает счетчик ссылок для каждой группы многоадресной рассылки, к которой он ранее присоединился, на определенном интерфейсе, и когда вы закрываете последний дескриптор файла, соответствующий сокету, который запросил членство в определенной группе, Linux проверяет, является ли счетчик ссылок на членство в этой группе имеет значение null, и в этом случае он отправит отчет о членстве с типом «Покинуть группу» на соответствующий сетевой интерфейс.
Просто сделайте следующее, чтобы проверить это самостоятельно:
Либо используйте вашу программу, либо используйте socat
запросить членство в определенной группе многоадресной рассылки. Например:
% socat STDIO UDP4-DATAGRAM:239.101.1.68:8889,ip-add-membership=239.0.1.68:192.168.250.2
(замените 192.168.250.2 на адрес одного из ваших интерфейсов — обратите внимание, что в этом примере интерфейс с этим адресом называется tun0
)
Теперь рассмотрим членство в многоадресных группах на вашем узле Linux:
% netstat -gn
IPv6/IPv4 Group Memberships
Interface RefCnt Group
--------------- ------ ---------------------
lo 1 224.0.0.1
[...]
tun0 1 239.0.1.68
Наконец, изучите сетевой интерфейс:
# tshark -n -i tun0 -Y igmp
Running as user "root" and group "root". This could be dangerous.
Capturing on 'tun0'
Убей сокат (pkill socat
, например).
Вы должны увидеть следующую строку, написанную tshark:
7 2.197520 192.168.250.2 -> 224.0.0.22 IGMPv3 40 Membership Report / Leave group 239.0.1.68
Более того, вы можете попытаться запустить много экземпляров вашей программы одновременно, вы увидите, что только когда вы убьете последний экземпляр, Leave group
сообщение отправлено Вы также увидите, что количество экземпляров запущенных программ — это число, которое отображается в выходных данных 2-го столбца netstat -gn
,
Будет ли многоадресная рассылка продолжать доставляться на мой сетевой интерфейс вышестоящим маршрутизатором?
Нет, если на вашем хосте нет других участников группы.
Достаточно ли умна ОС (в моем случае, Linux), чтобы отправить мне запрос на удаление, когда сокет закрыт?
Да. Вам не нужно беспокоиться о IP_DROP_MEMBERSHIP, если вы не хотите динамически изменять группы в сокете, что довольно редко: я, конечно, никогда этого не делал.