Я пытаюсь прослушать все сообщения IGMP в локальной сети (по сумасшедшим причинам не обсуждаемые ;-)).
У меня есть несколько вопросов, связанных с этим, так как я на самом деле не эксперт по IGMP / маршрутизации.
Возможно ли это вообще? Я знаю, что могу читать IGMP из необработанного сокета, и я знаю, что вы можете использовать Wireshark для мониторинга сообщений IGMP, которые поступают на ваш локальный компьютер, но меня удивляет следующее:
Я использую программу на другом компьютере (отделенную от того, на котором работает Wireshark с помощью коммутатора), который присоединяется к адресу многоадресной рассылки - НО - не всегда я даже вижу отчет о членстве / JOIN в Wireshark. Теперь кто-нибудь знает, гарантируется ли, что каждое соединение IGMP распространяется по всей локальной сети? Иногда я вижу соединение в Wireshark, иногда нет.
При условии, что все сообщения о присоединении IGMP всегда отправляются на каждую станцию в сети, не должно быть возможности отслеживать, какие станции являются членами каких групп многоадресной рассылки, что-то вроде этого (код posix socket c ++):
int rawSock = ::socket(AF_INET, SOCK_RAW, IPPROTO_IGMP);
uint8_t buf[10*1024];
while(true)
{
ssize_t rval = ::recv(rawSock, buf, sizeof(buf), 0);
iphdr *iph = (iphdr*)buf;
printf("Received %d bytes - protocol %d\n", rval, iph->protocol);
/*do whatever needed to the IGMP message*/
}