gpt4 book ai didi

c++ - 如果我在关闭套接字之前不发送 IP_DROP_MEMBERSHIP 会怎样?

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:24 26 4
gpt4 key购买 nike

我正在编写一些使用 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

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

最佳答案

是的,Linux 为它之前在特定接口(interface)上加入的每个多播组维护一个引用计数,并且当您关闭与请求特定组成员资格的套接字对应的最后一个文件描述符时,Linux 检查引用计数是否为此组成员资格为空,如果是这种情况,它将在相应的网络接口(interface)上发送类型为“离开组”的成员资格报告。

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

  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 替换为您的其中一个接口(interface)的地址 - 请注意,在此示例中,具有此地址的接口(interface)名为 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. 最后,嗅探您的网络接口(interface):

    # 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 的第二列输出中的数字。

关于c++ - 如果我在关闭套接字之前不发送 IP_DROP_MEMBERSHIP 会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45442416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com