有人告訴我,UDP是無連接的,這意味着你不能確定包是否會到達目的地。udp如何工作.net
做的時候爲什麼:
var dataToSend = new byte[]{1};
UdpClient client = new UdpClient();
client.Send(dataToSend,1,"192.168.0.45", 1234);
變量初始化LocalEndpoint:
糾正我,如果我錯了。我相信變量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);
「無連接」並不意味着「你不能確定包是否會到達目的地」。這意味着沒有設置和拆卸階段,並且您不知道接收器是否在那裏。即使在TCP中,也不能確定數據包是否已到達目的地,除非對等應用程序確認它們。 – EJP