2012-06-14 54 views
8

我想收到原始的TCP數據包,然後發送回相同的工作量。如何在C#中獲取原始TCP數據包?

它應該是這個樣子:

void OnPacketReceived(TcpPacket p) 
{ 
    byte [] body = p.GetBody(); 
} 

注:我需要的TCP數據包,而不是以太網幀。

+0

我可能是100%錯誤的,但我不知道這是可能的託管代碼做。據我所知,C#中的套接字庫專門使用流,從​​而抽象出數據包邊界。 –

+0

好吧,讓我們看看是否有人可以破解這個。 –

+2

你看過http://pcapdotnet.codeplex.com/它是WinPcap的一個.NET包裝器。 –

回答

6

如果將套接字作爲原始套接字實現,則可以訪問整個數據包(實際上必須自己處理數據包的所有內容)。

創建套接字時使用SocketType.Raw和ProtocolType.Raw。

請注意,如果以這種方式實現套接字,您將不得不處理TCP的詳細信息。

僅供參考,這裏是關於Socket類的MSDN文檔: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx

+0

+1:我用這種方法來檢查TCP數據包的頭是否有校驗和(因爲它不是強制性的)。 –

+0

@AllonGuralnek你能分享一下嗎?或者至少概述爲實現這一目標需要做些什麼? –

+0

@dodexahedron - 你是否100%肯定,如果我連接原始套接字,我可以直接訪問TCP數據包? (這實際上是個問題)。如果您確定可以請確認,並將其標記爲答案。謝謝。 –

0

你需要使用數據包嗅探器,你可以把你的選擇,並在此基礎上過濾器也作出迴應。

。WinPcap周圍的網絡包裝可以證明對您有幫助。

相關問題