2017-02-24 68 views
2

我正在使用Ubuntu 16.04。 创建一个连接/离开多播组的UDP套接字的C++代码。Ubuntu C++多播双人群消息

加入/离开组的代码工作正常,但我正在玩弄它,并注意到wireshark中有什么,我无法找到关于它的信息。

当代码在我呼叫离开组之前退出。 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)) 

回答

3

这在RFC 3376 Section 8.1描述。所有IGMP查询重复多次,称为健壮性变量。健壮性变量的值默认为2,并且可以使用sysctl来调整:

$ sysctl net.ipv4.igmp_qrv 
net.ipv4.igmp_qrv = 2 
$ sudo sysctl net.ipv4.igmp_qrv=1 
net.ipv4.igmp_qrv = 1