2011-10-13 37 views
1

我构建了一个用于执行IGMP事件的库。现在,愚蠢的是,我的图书馆还进行存在监控,以确保其他人仍然是该组的一部分。侦听IGMP流量

IGMP在较低级别完成同样的事情。分组消息,轮询路由器,它仍然是同一组的一部分,整个事情。我刚刚重复了所有相同的工作,而且可能不那么健壮。

如果我可以利用这些数据包,我可以使一切变得更加清洁(并且我不会重新发明轮子)。

任何人都有这样的经验吗?也许创建某种疯狂的套接字?我不想为它使用libpcap。我不认为语言很重要,只要在Windows/Linux上使用套接字是可能的。

+0

AFAIK没有纯粹的.NET/Mono解决方案用于这个级别的访问......最好的选择是集成了网络堆栈的驱动程序......这样的驱动程序可以使用C编写 – Yahia

+0

它看起来很可能使用原始套接字。 IOControlCode.ReceiveAllIgmpMulticast 仍在研究 – RandomInsano

回答

1

好的,找到了方法。由于我必须手工提取需要的信息,所以它现在超级肮脏,但实际上,如何在接口上拉取IGMP数据(请注意,您需要具有管理员权限才能提取原始数据):

var buffer = new byte[65536]; 
var s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Igmp); // filter out non IGMP 
byte[] one = BitConverter.GetBytes(1); 
s.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.148"), 0)); // Which interface to listen on 
s.IOControl(IOControlCode.ReceiveAll, one, one); // enter promiscuous mode 
s.Recieve(buffer); // get yourself some data (BeginRecieve didn't seem to work here) 

然后用上述缓冲区做些什么。如果你在wireshark中戳穿,你可以看到数据包崩溃

+0

另外,65536是巨大的。由于这些消息在IP堆栈中的位置,该数字实际上应该是MTU的大小。我认为现在9K是最大的? – RandomInsano