C++ 如果我不';在关闭我的套接字之前,是否不发送IP_DROP_成员资格?
我正在编写一些代码,使用IGMP连接来连接多播组C++ 如果我不';在关闭我的套接字之前,是否不发送IP_DROP_成员资格?,c++,sockets,multicast,igmp,C++,Sockets,Multicast,Igmp,我正在编写一些代码,使用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)
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)"));
但是,它不执行IP\u DROP\u成员资格
- 多播将继续通过上游路由器传送到我的网络接口吗
- 操作系统(在我的例子中是Linux)是否足够聪明,可以在套接字关闭时为我发送删除成员资格请求
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
)% 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'
现在,杀死socat(pkillsocat
)。
您应该看到tshark写的以下行:
7 2.197520 192.168.250.2 -> 224.0.0.22 IGMPv3 40 Membership Report / Leave group 239.0.1.68
离开组
消息才会被发送。您还将看到正在运行的程序的实例数是出现在netstat-gn
第2列输出中的数字
多播将继续通过上游路由器传送到我的网络接口吗
除非主机中有其他组成员,否则不会
操作系统(在我的例子中是Linux)是否足够聪明,可以在套接字关闭时为我发送删除成员资格请求
对。除非您想在套接字上动态更改组,否则您不必担心IP_DROP_成员身份,这是非常罕见的:我当然从来没有这样做过。谢谢!你有什么我可以确认的参考资料吗?是的,我已经更新了我的答案,所以你可以自己试试。此外,您还可以查看名为src/net/ipv4/igmp.c的内核源文件,这是维护refcnt的代码,当refcnt和send
leave group
从非null变为null时(此文件仅用于ipv4组成员身份),感谢您提供的非常详细的响应!你知道Windows是否也能做到这一点吗?我一直在想,是否应该输入复杂的代码来处理应用程序崩溃,从而阻止应用程序发送它。
7 2.197520 192.168.250.2 -> 224.0.0.22 IGMPv3 40 Membership Report / Leave group 239.0.1.68