2015-07-10 249 views
0

這不是問題,而是好奇心。我使用UDP創建了一個簡單的發送/接收C#應用程序,主要遵循UdpClient上的MSDN示例。我有一個文本框用作發送或接收事件的日誌;它打印時間戳以及從哪裏發送/接收的內容。當收到UDP數據包時,該端口與監聽端口不匹配

好奇心帶着端口號進來。當程序在某個端口上偵聽並收到一個數據包時,收到的數據包上的端口與它正在偵聽的端口不匹配。

例如,這裏的應用程序的截圖(注:這即使使用不同的電腦發送仍然發生/接收):

它接收到的數據包就好了,這就是爲什麼並不是真正的「問題」,因爲它正在工作。我只是好奇爲什麼收到的數據包上的端口顯示不同於它正在監聽的端口。我想知道如果也許它只是垃圾數據?

下面是當接收數據(使用我從MSDN拿起的AsyncCallback)運行的代碼:

private void ReceiveCallback(IAsyncResult ar) 
{ 
    try { 
     // Pull the socket from the AsyncResult parameter 
     UdpState state = (UdpState)(ar.AsyncState); 
     UdpClient udp = state.udp; 
     IPEndPoint end = state.endpoint; 

     // Grab and convert the message into a string 
     byte[] recvBytes = udp.EndReceive(ar, ref end); 
     string recvString = Encoding.ASCII.GetString(recvBytes); 

     /* Here's where it's logging the IPEndPoint onto the console. 
     * Is the port meaningless when receiving a packet, and that's why it's 
     * always something random? Or is there some meaning to it that I'm 
     * unaware of? */ 
     ConsoleLog(end.ToString() + " Recv: " + recvString); 

     // Start the listen cycle again so this will be called again 
     listener.BeginReceive(new AsyncCallback(ReceiveCallback), state); 
    } catch (ObjectDisposedException) { 
     // Do nothing - Expected error when the UDP Listener is closed. 
    } 
} 

正在接收數據包時,只是毫無意義的垃圾數據的端口號,或者它有某種使用?

+0

的通信信道作爲一個IP地址和端口對,你看到的客戶端端口是從必須預先知道服務器端口不同讓客戶知道向哪裏發送到的每個端部。 – BhavO

回答

0

每個UDP數據包都有一個源和目的IP地址和端口,你看到的是源端口地址。

的公知端口用於將數據發送到,機器發送數據分配一個空閒的端口到報文的源端口,以便它可以從該端口上的服務器接收數據。

0

有在連接的每一端的端口號:你的進程正在監聽公佈的端口號,始發(客戶端)端口號(這可能是一個不同的機器上)。