join/leave multicast group using libpcap
我需要接收一个多播流,但是在CentOS 5.5上按源MAC地址过滤传入的数据包。
我打算使用libpcap库。
是否可以使用libpcap加入/离开多播组?
如果是,该怎么做?
谢谢
1。创建虚拟套接字:sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
2。绑定:rc = bind(sd, (sockaddr*) &addr, sizeof(sockaddr_in));
3。加入多播组:
1 2 3 4 5 6 7
| ip_mreq mreq;
mreq.imr_interface.s_addr = htonl(InterfaceIp);
mreq.imr_multiaddr.s_addr = htonl(DestIp);
if (setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
close(sd);
// Error handle...
} |
不使用虚拟套接字发送或接收数据包
4。使用pcap_open_live()
打开pcap
一般的想法是使用常规套接字以"告诉"内核以发送IGMP加入数据包,并在使用pcap之后以捕获数据包。
当然,只需构造并发送适当的IGMP数据包。
- 怎么做?我需要使用什么API?
-
上面的答案比我的建议要好。但是,如果您可以将源MAC地址与IP地址相关联,那么最好在应用程序中完成所有操作,而根本不用libpcap。只需将MCoutlets连接到所需的源IP地址,即可过滤掉其他所有内容。如果有多个所需来源,则可以在同一端口上运行多个MC套接字。
-
我不需要接收我的应用程序正在生成的数据包。我创建了过滤器,该过滤器传递除我自己的MAC地址发出的数据包以外的所有数据包
-
有一个套接字选项。您真的很难做到这一点!使用UDP套接字即可轻松完成所有操作。好吧,容易些。
-
有什么选择?您是要使用setsockopt()吗?我检查了所有可能的选项,但没有发现任何可以帮助您的内容
-
IP_MULTICAST_LOOP或IPv6_MULTICAST_LOOP。但是,即使您没有它,也很容易检查应用程序代码中接收到的数据报的IP地址,而完全不用libpcap。组播已经足够困难;-)