2011-09-20 33 views
0

我有一個C#應用程序可以在多臺機器上工作,但由於某種原因,不適用於另一臺機器。全部是Windows XP。如何可以通過wireshark接收udp廣播數據包但不是套接字監聽器

我只需打開一個端口,偵聽:

void Open() 
{ 
var myIpAddress = UdpComm.GetPcIpAddress(target); 

listenEndPoint = new IPEndPoint(myIpAddress, RemotePort); 

System.Windows.Forms.MessageBox.Show("Creating listener: " + target.ToString() + " - " + listenEndPoint.ToString()); 
_client = new UdpClient(listenEndPoint); 
_client.EnableBroadcast = true; 
_client.BeginReceive(ReceiveCallback, null); 
} 

public void ReceiveCallback(IAsyncResult ar) 
{ 
    System.Windows.Forms.MessageBox.Show("Data received"); 
} 

當我運行程序時,我看到Open方法成功運行,並且該地址和端口看起來是正確的。

當我在Wireshark上看到這一點時,我也看到數據正確地從遠程地址發送,但我從來沒有看到回調消息框。

我沒有任何錯誤被拋出。什麼可能導致數據顯示在Wireshark上,但不是在我的應用程序中的任何想法?

+0

「我沒有任何錯誤被拋出。」 - 沒有嘗試/抓住吞嚥錯誤? –

+0

Open方法有一個try塊,但catch塊會彈出一個消息框,但第一件事是異常。 – John

+0

在異步回調中顯示消息框是一個壞主意。對於我們所知道的,它可能實際上被顯示,但它隱藏在另一個窗口後面。它不會再次顯示,也不會顯示EndReceive調用。 –

回答

2

Wireshark捕獲所有內容,而您的應用程序僅獲取過濾後的內容。
問題可能在發件人一方。本質上,子網掩碼定義哪個地址部分定義網絡和哪個節點。因此,子網掩碼爲255.255.252.0,網絡地址長度爲22位。
假設你的客戶端是10.0.16.100 \ 22。爲了廣播目的,具有最高可能地址的節點地址被保留。許多應用程序預計網絡掩碼長度爲24位(255.255.255.0),並將播放至10.0.16.255。這是錯誤的,因爲只設置了最後8位。在這樣的子網中適當的廣播地址應該是10.0.19.255

+0

假設有人發送帶有255.0.0.0掩碼的消息,並且我有255.255.0.0。我的電腦會收到這條消息,但它會被過濾掉,我將無法在我的應用程序中讀取它。是否有任何技巧在應用程序中獲取此消息? – dmigo

0

您必須結束異步接收過程才能捕獲傳入數據。當你調用_client.BeginReceive()時,它會產生一個線程來爲你接收傳入的數據。爲了捕獲這些數據,您應該將以下代碼添加到ReceiveCallback中。然後,您將能夠按照您認爲合適的方式使用傳入的字節[]。

http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.endreceive.aspx

+0

感謝您的回覆。這實際上是在回調中,爲了簡潔起見,我剛剛將其留出。 – John

+0

@John - 你永遠不會知道!很高興你發現了這個問題。 – Dubs

2

我的回調開始被調用一次,我改變了網卡的子網掩碼255.255.255.0是:

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0); 
byte[] incomingBytes = _client.EndReceive(ar, ref endPoint); 

此外,您可以通過以下鏈接參考MSDN上的UdpClient類而不是255.255.252.0。

我不知道爲什麼wireshark可以看到流量,但不是UdpClient,但這種改變似乎有所作爲。

+0

如果你正在回答你自己的問題,你應該接受這個答案。 –

+0

我會盡快讓網站讓我。顯然,在你做到這一點之前,有一個24小時的冷靜期。 – John

相關問題