2012-10-16 204 views
0

我有一個簡單的UDP偵聽器,我試圖從中收集數據報。我的數據報可以是兩種數據格式之一。使用第一種數據格式,我按照預期在我的程序中接收數據。第二,絕對沒有跡象表明數據是從我的程序收到的,儘管我可以通過Wireshark驗證UDP數據是否傳遞到網絡接口。我認爲這些可能是Windows拒絕的畸形UDP數據包,但Wireshark確實將它們標記爲UDP。我的代碼如下:.NET UDP數據接收

static void Main(string[] args) 
    { 
     Thread thdUdpServer = new Thread(new ThreadStart(serverThread)); 
     thdUdpServer.Start(); 
    } 

    static void serverThread() 
    { 

     Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     socket.Bind(new IPEndPoint(new IPAddress(0), 2000)); 

     while (true) 
     { 
      byte[] responseData = new byte[128]; 
      socket.Receive(responseData); 
      string returnData = Encoding.ASCII.GetString(responseData); 
      Console.WriteLine(DateTime.Now + " " + returnData); 

     } 

丟失的數據包都是29字節的數據報,看起來像這樣(轉換爲ASCII)。

#01RdFFFF...?...... ........F 

爲什麼Wireshark會顯示它們的存在,但.NET似乎沒有看到它們?

回答

2

如果字節包含不可打印的ASCII字符,您可能無法在控制檯上看到它們。

+0

爲了澄清,我試圖用返回的數據打印DateTime.Now,但仍然沒有看到任何東西。 – kittyhawk

+0

29字節數據報包含什麼?你能發佈前幾個字節嗎? – HyperDev

+0

我在原帖中添加了數據報的例子。 – kittyhawk

0

代碼中缺少某些東西。當調用ReceiveFrom時,它應該拋出一個套接字異常(至少根據MSDN,還沒有試過你的代碼)。

你應該將你的套接字綁定到你想要監聽的地址:端口(或者使用0.0.0.0作爲在任何本地地址上收聽的地址):

socket.Bind(new IPEndPoint(new IPAddress(0), 2000); 

ReceiveFrom中的EndPoint不是服務器的偵聽端口。這是你想要接收數據包的地址。您可以使用端點0.0.0.0:0從任何主機接收。

從方法返回後,端點將填充發送數據包(客戶端)的主機的地址。

如果您不關心客戶端點,則可以使用Receive而不是ReceiveFrom。 可能你的客戶端沒有從192.168.1.100:2000發送數據包,這就是爲什麼你沒有收到它們;想到爲什麼在調用ReceiveFrom的時候沒有發生異常。

另外: 無需調用Convert.ToInt32在:

new IPEndPoint(IPAddress.Parse("192.168.1.100"), Convert.ToInt32(2000)); 

2000已經是一個int。

+0

我認爲這個異常可能是因爲它在一個單獨的線程中運行。我將不得不運行代碼... –

+0

你是對的。我不知道爲什麼我放棄了綁定聲明。我已將方法更改爲接收。但是,儘管在Wireshark中存在這些客戶端,但我仍然看不到來自這些客戶端的任何UDP數據包。 – kittyhawk

+0

我能想到的唯一的事情是它們沒有被髮送到正確的端口或正確的接口,你綁定到0.0.0.0還是綁定到特定的IP地址? –