2010-07-21 117 views
2

我想使用C#的UdpClient來偵聽任何包含的UDP數據包。我想接收來自任何IP和任何端口的數據包。如何接收來自任何IP和任何端口的UDP數據包?

我試過如下:

UdpClient udpClient = new UdpClient(0); 
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0); 
byte[] data = udpClient.Receive(ref ep); 

但沒有成功。

有誰知道最新錯誤? 在此先感謝!

+0

很確定你不能聽那樣的'每個'端口...不明白你爲什麼想要。 – Fosco 2010-07-21 15:47:10

+1

@Fosco:網絡嗅探器? – MPritchard 2010-07-21 15:47:47

+1

@MPritch:那真的不是UDP。你會聽原始的以太網數據包。 – 2010-07-21 15:51:42

回答

6

接收任何端口?這太瘋狂了。您將被其他應用程序的消息淹沒(嘗試使用TcpView來了解每秒鐘系統上有多少消息傳遞給您!)

您必須指定一個端口!港口是有點像一個標識符 - 此包是爲這個程序(通過端口號識別)

任何端口上發送是明智的,因爲它要求系統選擇一個端口發送OUT端口爲你 - - 這對於您的應用程序來說並不重要,因爲發件人有時可以使用

+2

Incase與否,有合法理由要這樣做。它可以在混雜模式下使用RAW + UDP套接字(並以管理員級別運行)。 – 2014-09-25 20:57:57

+0

在任何港口接收它是如何「瘋狂」,但不會在任何端口上發送*?如果邏輯是端口識別數據包指向哪個程序,那麼這將適用於發送和接收,對嗎? – Mud 2017-08-10 16:16:08

4

您需要監聽特定的端口。

通過傳入零,您被分配一個任意端口,因此您將只收到發往它的UDP數據報。換句話說,你什麼都不會收到。

如果你確實收到了一些東西,IPEndPoint將被填入關於發件人的信息。初始值可以用來限制發件人。

5

您的最佳想法是識別您想要聽的特定端口,然後開始聆聽這些端口。根據收到的數據報完成的操作,爲每個正在監聽的端口創建一個新的Thread可能是最好/最簡單的,並在那裏處理它,或者將它排入同步(與lock)隊列或列表中,以便處理一箇中心線程。

您應該限制端口;不可能全部聽取他們的意見。

也就是說你可以使用像WiresharkWinpcapSDK/API之類的東西,從網絡適配器中直接「嗅探」UDP數據包。我已經在.NET應用程序中工作,沒有太多困難。

希望有所幫助。

+0

示例API:pcapdotnet http://pcapdotnet.codeplex.com/ – 2010-07-31 04:43:18

相關問題