2017-02-24 67 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