【问题标题】:How udp works in .netudp 在 .net 中的工作原理
【发布时间】:2012-08-30 04:40:03
【问题描述】:

有人告诉我 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);

【问题讨论】:

  • “无连接”并不意味着“您无法确定包裹是否会到达目的地”。这意味着没有设置和拆除阶段,并且您不知道接收器是否在那里。即使在 TCP 中,您也无法确定数据包是否已到达目的地,除非对等应用程序确认它们。

标签: c# .net networking udp


【解决方案1】:

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

这段摘自MSDN

LocalEndPoint 属性获取一个包含本地 IP 的 EndPoint Socket 绑定的地址和端口号。你必须施放 在检索任何信息之前将此 EndPoint 指向 IPEndPoint。你 然后可以调用 IPEndPoint.Address 方法来检索本地 IPAddress 和用于检索本地端口的 IPEndPoint.Port 方法 号码。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2018-03-30
    • 2011-03-16
    • 2013-11-04
    • 2012-09-02
    相关资源
    最近更新 更多