2017-08-01 53 views
1

我工作的一些代碼,連接使用IGMP多播組加入如果在關閉套接字之前未發送IP_DROP_MEMBERSHIP,會發生什麼情況?

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

  • 組播是否繼續由上游路由器傳遞到我的網絡接口?
  • 當套接字關閉時,操作系統(在我的情況下爲Linux)是否足夠聰明,可以爲我發送drop membership request?

回答

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' 
    

    現在,殺死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消息。您還會看到,您正在運行的程序的實例數是出現在第二列netstat -gn的輸出中的數字。

+0

感謝您的支持!你有什麼樣的參考,我可以證實這一點嗎? –

+0

是的,我已經更新了我的答案,所以你可以自己嘗試。此外,您可以查看名爲src/net/ipv4/igmp.c的內核源文件,這是維護refcnt並在從非null更改爲null時發送'leave group'的代碼(此文件用於IPv4組僅限會員) –

+0

非常詳細的回覆謝謝! –

1

將組播繼續由上游路由器傳送到我的網絡接口?

不除非有您的主機其他組成員。

當套接字關閉時,操作系統(在我的情況下爲Linux)是否足夠聰明,可以爲我發送drop membership請求?

是的。除非您想在套接字上動態更改組,否則不必擔心IP_DROP_MEMBERSHIP,這很罕見:我從來沒有這樣做過。

相關問題