如何在特定接口下添加多播组(Windows)

时间:2016-04-14 06:33:13

标签: windows udp multicast

我可以使用命令" netsh interface ip show join"在cmd中显示每个接口下的多播组。但我真的不知道如何添加一个组 接口,如添加IP地址239.39.188.188到"接口8:VirtualBox Host-Only Network"。最简单的方法将不胜感激。

Interface 3: Ethernet
Scope       References  Last  Address
----------  ----------  ----  ---------------------
0                    0  Yes   224.0.0.1

Interface 1: Loopback Interface 
Scope       References  Last  Address
----------  ----------  ----  ---------------------
0                    2  Yes   239.255.255.250

Interface 8: VirtualBox Host-Only Network
Scope       References  Last  Address
----------  ----------  ----  ---------------------
0                    0  Yes   224.0.0.1
0                    1  Yes   224.0.0.251
                              239.39.188.188 // this is what I want to add

顺便说一下,我尝试了一些方法,比如打开UDP套接字并设置IP_ADD_MEMBERSHIP(How to add my host to Multicast Group...!)。另外,我尝试在linux上使用命令" ip maddr [add | del] MULTIADDR dev STRING"。 之后,我发现IP_ADD_MEMBERSHIP已成功设置。但结果是,在上表中,我无法在特定接口下添加组。 为了打开UDP套接字并设置IP_ADD_MEMBERSHIP部分,我在linux下编码如下。

        ip_mreq mreq;
        mreq.imr_multiaddr.s_addr = inet_addr(_outIP.c_str()); // _outIP is destination address(group address), interface is ethernet interface
        mreq.imr_interface.s_addr = _interface.length() > 0 ? inet_addr(_interface.c_str()) : htonl(INADDR_ANY);

        if (setsockopt(_udpSock,IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(struct ip_mreq)) == -1) {
            cout << "Fail to add ip membership!!!!" << endl;

        }
        else {

            cout << "Success to add ip membership!!!!" << endl;

            s = sprintf(warnmsg, "Success to add ip membership!!!!");
            _ofile->write(warnmsg, s);

        }

1 个答案:

答案 0 :(得分:0)

您必须永久保持加入群组的套接字。换句话说,您的程序不得终止。最后添加for (;;) { sleep(1000000); }左右。

当您编程终止时,套接字会自动关闭,您的操作系统(Windows或Linux,无关紧要)会再次离开该组。

操作系统中发生的情况稍微复杂一些,因为多个程序可能加入同一个组播组,因此操作系统会保留引用计数,当组不再被任何套接字引用时,机器只会离开组。