Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我不';在关闭我的套接字之前,是否不发送IP_DROP_成员资格?_C++_Sockets_Multicast_Igmp - Fatal编程技术网

C++ 如果我不';在关闭我的套接字之前,是否不发送IP_DROP_成员资格?

C++ 如果我不';在关闭我的套接字之前,是否不发送IP_DROP_成员资格?,c++,sockets,multicast,igmp,C++,Sockets,Multicast,Igmp,我正在编写一些代码,使用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)

我正在编写一些代码,使用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)"));
但是,它不执行
IP\u DROP\u成员资格

  • 多播将继续通过上游路由器传送到我的网络接口吗
  • 操作系统(在我的例子中是Linux)是否足够聪明,可以在套接字关闭时为我发送删除成员资格请求

是的,Linux为它以前在特定接口上加入的每个多播组维护一个引用计数,当您关闭请求特定组成员身份的套接字对应的最后一个文件描述符时,Linux会检查此组成员身份的引用计数是否为空,如果是空,它将在相应的网络接口上发送类型为“休假组”的成员报告

只需执行以下操作即可自行检查:

  • 使用您的程序,或使用
    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

  • 现在,查看Linux节点上的多播组成员资格:

    % netstat -gn
    IPv6/IPv4 Group Memberships
    Interface       RefCnt Group
    --------------- ------ ---------------------
    lo              1      224.0.0.1
    [...]
    tun0            1      239.0.1.68
    
  • 最后,嗅探您的网络接口:

    # tshark -n -i tun0 -Y igmp
    Running as user "root" and group "root". This could be dangerous.
    Capturing on 'tun0'
    
    现在,杀死socat(
    pkillsocat
    )。 您应该看到tshark写的以下行:

    7   2.197520 192.168.250.2 -> 224.0.0.22   IGMPv3 40 Membership Report / Leave group 239.0.1.68
    
  • 此外,您可以尝试同时启动程序的多个实例,您将看到只有在杀死最新实例时,
    离开组
    消息才会被发送。您还将看到正在运行的程序的实例数是出现在
    netstat-gn
    第2列输出中的数字

    多播将继续通过上游路由器传送到我的网络接口吗

    除非主机中有其他组成员,否则不会

    操作系统(在我的例子中是Linux)是否足够聪明,可以在套接字关闭时为我发送删除成员资格请求


    对。除非您想在套接字上动态更改组,否则您不必担心IP_DROP_成员身份,这是非常罕见的:我当然从来没有这样做过。

    谢谢!你有什么我可以确认的参考资料吗?是的,我已经更新了我的答案,所以你可以自己试试。此外,您还可以查看名为src/net/ipv4/igmp.c的内核源文件,这是维护refcnt的代码,当refcnt和send
    leave group
    从非null变为null时(此文件仅用于ipv4组成员身份),感谢您提供的非常详细的响应!你知道Windows是否也能做到这一点吗?我一直在想,是否应该输入复杂的代码来处理应用程序崩溃,从而阻止应用程序发送它。
    7   2.197520 192.168.250.2 -> 224.0.0.22   IGMPv3 40 Membership Report / Leave group 239.0.1.68