我工作的一些代码,连接使用IGMP多播组加入如果在关闭套接字之前未发送IP_DROP_MEMBERSHIP,会发生什么情况?
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)是否足够聪明,可以为我发送drop membership request?
感谢您的支持!你有什么样的参考,我可以证实这一点吗? –
是的,我已经更新了我的答案,所以你可以自己尝试。此外,您可以查看名为src/net/ipv4/igmp.c的内核源文件,这是维护refcnt并在从非null更改为null时发送'leave group'的代码(此文件用于IPv4组仅限会员) –
非常详细的回复谢谢! –