[英]How can a udp broadcast packet be received by wireshark but not socket listener
我有一個可以在多台計算機上運行的C#應用程序,但是由於某種原因,它不能在另一台計算機上使用。 都是Windows XP。
我只是打開一個端口並聽:
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上但不在我的應用程序中的任何想法?
一旦將NIC的子網掩碼更改為255.255.255.0(而不是255.255.252.0),便開始調用回調。
我不確定為什么wireshark可以看到流量,但是看不到UdpClient,但是這種變化似乎有所作為。
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
您必須結束異步接收過程才能捕獲傳入的數據。 當您調用_client.BeginReceive()時,它會生成一個線程來接收您的傳入數據。 為了捕獲此數據,您應該將以下代碼添加到ReceiveCallback中。 然后,您將可以根據需要使用傳入的byte []。
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] incomingBytes = _client.EndReceive(ar, ref endPoint);
此外,您可以通過以下鏈接在MSDN上引用UdpClient類:
http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.endreceive.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.