ローカル ネットワーク上のすべての IGMP メッセージを盗聴しようとしています (これについては説明しません ;-))。私は IGMP/ルーティングの専門家ではないので、これに関していくつか質問があります。
それは可能ですか?raw ソケットから IGMP を読み取ることができることは知っていますし、Wireshark を使用してローカル コンピューターに到達する IGMP メッセージを監視できることも知っていますが、私を困惑させるのは次の点です。
マルチキャストアドレスに参加する別のコンピューター(スイッチによってWiresharkを実行しているコンピューターから分離された)でプログラムを使用していますが、Wiresharkでメンバーシップレポート/ JOINが表示されるとは限りません。すべてのIGMP 参加がローカル ネットワーク全体に分散されていることが保証されているかどうかは誰にもわかりませんか? Wireshark で結合が表示されることもあれば、表示されないこともあります。
すべての IGMP Join メッセージが常にネットワーク上のすべてのステーションに送信されると仮定すると、次のようなことを行うマルチキャスト グループのメンバーであるステーションを監視することはできないはずです (posix ソケットの 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*/
}