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