3

有人告诉我 UDP 是无连接的,这意味着您无法确定包裹是否会到达目的地。

为什么在做的时候:

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);
4

1 回答 1

3

Bind 为您提供 LocalEndPoint 属性中包含的信息,而不是路由器:

这段摘录来自MSDN

LocalEndPoint 属性获取一个 EndPoint,其中包含您的 Socket 绑定到的本地 IP 地址和端口号。在检索任何信息之前,您必须将此 EndPoint 转换为 IPEndPoint。然后,您可以调用 IPEndPoint.Address 方法来检索本地 IPAddress,并调用 IPEndPoint.Port 方法来检索本地端口号。

LocalEndPoint 属性通常在调用 Bind 方法后设置。如果您允许系统分配您的套接字的本地 IP 地址和端口号,则 LocalEndPoint 属性将在第一次 I/O 操作后设置。对于面向连接的协议,第一个 I/O 操作是调用 Connect 或 Accept 方法。对于无连接协议,第一个 I/O 操作将是任何发送或接收调用。

但是您的理解是正确的,UDP 是一种发送数据的方式。

于 2012-08-30T08:43:02.830 回答