我工作的一些代碼,連接使用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?
感謝您的支持!你有什麼樣的參考,我可以證實這一點嗎? –
是的,我已經更新了我的答案,所以你可以自己嘗試。此外,您可以查看名爲src/net/ipv4/igmp.c的內核源文件,這是維護refcnt並在從非null更改爲null時發送'leave group'的代碼(此文件用於IPv4組僅限會員) –
非常詳細的回覆謝謝! –