2012-08-30 31 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是一种失败的发送数据的风格。