Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# udp在.net中的工作原理_C#_.net_Networking_Udp - Fatal编程技术网

C# udp在.net中的工作原理

C# udp在.net中的工作原理,c#,.net,networking,udp,C#,.net,Networking,Udp,我被告知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)

我被告知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);

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

本节选自:

LocalEndPoint属性获取包含本地IP的端点 套接字绑定到的地址和端口号。你必须投 在检索任何信息之前,请将此端点连接到IPEndPoint。你 然后可以调用IPEndPoint.Address方法来检索本地 IPAddress和IPEndPoint.Port方法来检索本地端口 号码

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

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

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