Ubuntu C ++组播双离开组消息

时间:2017-02-24 13:58:32

标签: c++ linux sockets kernel multicast

我正在使用ubuntu 16.04。 用于创建加入/离开多播组的UDP套接字的C ++代码。

加入/离开小组的代码有效,但我正在玩它并在wireshark中发现了一些内容,我无法找到有关它的信息。

当我调用离开组之前代码退出时。 Wireshark获取2个离开组消息。我认为当代码退出内核时会关闭套接字并发送一个离开组消息?但为什么2?它总是2。

编辑:此外,当我打电话给离开组wireshark选择2离开组消息。 我确信该功能只执行一次(因为打印)。 2条消息是否正常?

此外,我在连接功能中添加了一个打印,它只被调用一次,但有时wirehark会选择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)) 

1 个答案:

答案 0 :(得分:3)

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