2012-08-30 29 views
3

有人告訴我,UDP是無連接的,這意味着你不能確定包是否會到達目的地。udp如何工作.net

做的時候爲什麼:

var dataToSend = new byte[]{1}; 
UdpClient client = new UdpClient(); 
client.Send(dataToSend,1,"192.168.0.45", 1234); 

變量初始化LocalEndpoint:

enter image description here

糾正我,如果我錯了。我相信變量LocalEndPoint是由路由器初始化的。我相信這是因爲每次服務器(192.168.0.45)收到數據然後回覆時,我都會看到數據正在通過回覆端口62446發送。

所以我的問題是如果我使用udp協議爲什麼我得到了路由器的響應?如果我得到路由器的響應,那麼這不是UDP或者我對udp有一個錯誤的理解。我不認爲端口號是隨機選取的。如果我已經配置路由器在端口62446上執行端口轉發到其他某臺計算機,那麼我的程序將無法工作。


這裏是客戶端代碼:

string ipOfServer = "192.168.0.45"; 
int portServerIsListeningOn = 1234; 

// send data to server 
Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint sending_end_point = new IPEndPoint(IPAddress.Parse(ipOfServer), portServerIsListeningOn); 
sending_socket.SendTo(Encoding.ASCII.GetBytes("Test"), sending_end_point); 

// after I send data localendpoint gets initialized! and the server always respond through that port! 

// get info 
var port = sending_socket.LocalEndPoint.ToString().Split(':')[1]; 

// now wait for server to send data back 
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, int.Parse(port)); 
byte[] buffer = new byte[1024]; 
sending_socket.Receive(buffer); // <----- keeps waiting in here :(

這裏是服務器代碼:

// wait for client to send data 
UdpClient listener = new UdpClient(11000); 
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 11000);   
byte[] receive_byte_array = listener.Receive(ref groupEP); 
listener.Connect(groupEP); 

// reply 
byte[] dataToSend = new byte[] { 1, 2, 3, 4, 5 }; 
listener.Send(dataToSend, dataToSend.Length); 
+0

「無連接」並不意味着「你不能確定包是否會到達目的地」。這意味着沒有設置和拆卸階段,並且您不知道接收器是否在那裏。即使在TCP中,也不能確定數據包是否已到達目的地,除非對等應用程序確認它們。 – EJP

回答

3

綁定是給你包含在LocalEndPoint財產信息不路由器:

這摘錄來自MSDN

的LocalEndPoint屬性獲取包含到您的套接字綁定的本地IP 地址和端口號的端點。在檢索任何信息之前,您必須將此EndPoint轉換爲IPEndPoint 。然後您可以調用IPEndPoint.Address方法來檢索本地IP地址 ,並使用IPEndPoint.Port方法檢索本地端口 的數字。

的LocalEndPoint屬性您對 Bind method呼叫後通常被設定。如果允許系統分配您的套接字的本地IP地址和端口號,則LocalEndPoint屬性將在第一次I/O操作後設置爲 。對於面向連接的協議,第一個I/O操作將是對Connect或Accept方法的調用。對於 無連接協議,第一個I/O操作將是 發送或接收呼叫中的任何一個。

但是你的理解是正確的,UDP是一種失敗的發送數據的風格。