1.Создание фиктивного гнезда: sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
2.Связать его: rc = bind(sd, (sockaddr*) &addr, sizeof(sockaddr_in));
3.Присоединиться к группе многоадресной рассылки:
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.open pcap, используя pcap_open_live()
Общая идея состоит в том, чтобы использовать обычный сокет, чтобы «сообщить» ядру отправлять пакет соединения IGMP и после использованияpcap для захвата пакетов.