2017-08-01 7 views
1

ソケットを閉じる前にIP_DROP_MEMBERSHIPを送信しないとどうなりますか?私は、IGMPを使用してマルチキャストグループに参加するいくつかのコードに取り組んでいる

struct ip_mreq mreq; 
inet_pton(AF_INET, group, &mreq.imr_multiaddr.s_addr); 
mreq.imr_interface.s_addr = htonl(INADDR_ANY); 

if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char*)&mreq, sizeof(mreq)) < 0) 
    throw std::runtime_error(perror("setsockopt(IP_ADD_MEMBERSHIP)")); 

アプリケーションがシャットダウンすると、それは

close(fd); 

しかしソケットを閉じ、それが実行されない参加しますIP_DROP_MEMBERSHIP

  • マルチキャストは引き続きアップストリームルータによってネットワークインターフェイスに配信されますか。
  • OSが(私の場合、Linuxの場合)ソケットが閉じられたときに私のためのドロップメンバーシップのリクエストを送信するのに十分なスマートですか?

答えて

3

はい、Linuxは特定のインタフェースで以前に参加したマルチキャストグループの参照カウントを保持しています。特定のグループメンバーシップを要求したソケットに対応する最後のファイルディスクリプタを閉じると、Linuxはこのグループメンバーシップへの参照カウントはヌルです。この場合、対応するネットワークインターフェイス上でタイプを「メンバーシップ」としたメンバーシップレポートを送信します。

ちょうど自分でそれを確認するには、次の操作を行います。

  1. のどちらかが、あなたのプログラムを使用する、または特定のマルチキャストグループメンバーシップを求めるためにsocatを使用しています。例えば:

    % socat STDIO UDP4-DATAGRAM:239.101.1.68:8889,ip-add-membership=239.0.1.68:192.168.250.2 
    

    (あなたのインタフェースのいずれかのアドレスで192.168.250.2を置き換える - 、このアドレスを持つインタフェースはtun0という名前なお、この例では)今

  2. 、マルチキャストグループを見てあなたのLinuxノード上の会員:最後に

    % netstat -gn 
    IPv6/IPv4 Group Memberships 
    Interface  RefCnt Group 
    --------------- ------ --------------------- 
    lo    1  224.0.0.1 
    [...] 
    tun0   1  239.0.1.68 
    
  3. 、ネットワークインタフェースを嗅ぐ:

    # tshark -n -i tun0 -Y igmp 
    Running as user "root" and group "root". This could be dangerous. 
    Capturing on 'tun0' 
    

    ここで、kill socat(たとえば、pkill socat)を削除します。 あなたがtsharkのによって書かれた次の行、表示されますことを、また、あなたは同時にあなたのプログラムの多くのインスタンスを起動しようとすることができ、あなたはそれはあなたが最新のインスタンスを殺すときにだけだとわかります

    7 2.197520 192.168.250.2 -> 224.0.0.22 IGMPv3 40 Membership Report/Leave group 239.0.1.68 
    

Leave groupメッセージが送信されます。また、実行中のプログラムのインスタンス数は、2列目の出力に表示される数字であることがわかります(netstat -gn)。

+0

ありがとうございます!あなたは私がこれを確認することができる参考資料を持っていますか? –

+0

はい、自分の答えを更新しましたので、自分で試してみることができます。さらに、src/net/ipv4/igmp.cという名前のカーネルソースファイル、つまりrefcntを維持するコードを見て、非ヌルからヌルに変わったときに 'leave group'を送信することができます(このファイルはIPv4グループ用です)会員のみ) –

+0

非常に詳しい回答をありがとう! –

1

マルチキャストは引き続きアップストリームルータによってネットワークインターフェイスに配信されますか。

あなたのホストに他のグループのメンバーがいない限り、そうではありません。

OSが(私の場合、Linuxの場合)ソケットが閉じられたときに私のためにドロップメンバーシップの要求を送信するのに十分なスマートなのですか?

はい。ソケットでグループを動的に変更したい場合を除いて、IP_DROP_MEMBERSHIPについて心配する必要はありません。これはかなりまれです。

関連する問題