我可以使用命令" 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);
}
答案 0 :(得分:0)
您必须永久保持加入群组的套接字。换句话说,您的程序不得终止。最后添加for (;;) { sleep(1000000); }
左右。
当您编程终止时,套接字会自动关闭,您的操作系统(Windows或Linux,无关紧要)会再次离开该组。
操作系统中发生的情况稍微复杂一些,因为多个程序可能加入同一个组播组,因此操作系统会保留引用计数,当组不再被任何套接字引用时,机器只会离开组。