Ubuntu C++多播双离群消息

Ubuntu C++ multicast double leave group message

我正在开发 ubuntu 16.04。 用于创建 joins/leaves 多播组的 UDP 套接字的 C++ 代码。

joining/leaving 小组的代码有效,但我正在使用它并注意到 wireshark 中的一些东西,但我找不到相关信息。

当代码在我调用 leave group 之前退出时。 Wireshark 接收到 2 条离开组的消息。我认为当代码退出时内核会关闭套接字并发送离开组消息?但是为什么是2?总是 2.

编辑:另外,当我呼叫离开群组时,wireshark 接收到 2 条离开群组的消息。 我确定该函数只执行一次(因为打印)。这 2 条消息是正常行为吗?

我还向连接函数添加了打印,它只被调用一次,但有时 wireshark 会收到 2 条连接消息?有时会发生这种情况。我不知道这个。

但是代码有效,所以我认为行为与内核如何处理这些事情更相关?

在代码中,我为加入做了类似的事情

ip_mreq multicastRequest;
std::cout << "joinGroup called" << std::endl;
multicastRequest.imr_multiaddr.s_addr = inet_addr(multicastGroup.c_str());
multicastRequest.imr_interface.s_addr = inet_addr(interfaceAddress(interface).c_str());
setsockopt(sockDesc_, IPPROTO_IP, IP_ADD_MEMBERSHIP,&multicastRequest, sizeof(multicastRequest))

请假:

ip_mreq multicastRequest;
std::cout << "leaveGroup called" << std::endl;
multicastRequest.imr_multiaddr.s_addr = inet_addr(multicastGroup.c_str());
multicastRequest.imr_interface.s_addr = inet_addr(interfaceAddress(interface).c_str());
setsockopt(sockDesc_, IPPROTO_IP, IP_DROP_MEMBERSHIP,&multicastRequest, sizeof(multicastRequest)) 

这在 RFC 3376 Section 8.1 中有描述。所有 IGMP 查询都会重复多次,称为 稳健性变量 。 robustness 变量的值默认为 2,可以使用 sysctl net.ipv4.igmp_qrv:

进行调整
$ sysctl net.ipv4.igmp_qrv
net.ipv4.igmp_qrv = 2
$ sudo sysctl net.ipv4.igmp_qrv=1
net.ipv4.igmp_qrv = 1