2011-10-13 39 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