如何从每个 UdpClient 的特定远程客户端接收 UDP 数据包? (.Net 4.6)
How to receive UDP packets from a specific remote client per UdpClient? (.Net 4.6)
我正在尝试弄清楚服务器如何区分通过 TCP 侦听器连接到它的多个客户端,并开始将 UDP 消息发送到 UdpClient。
TcpListner 使 TCP 变得容易,因为返回了一个 TcpClient,我可以附加到服务器上的特定客户端实例。但是,由于 UDP 是无连接协议,我现在将如何处理 UdpClient?我也很好奇 TcpClient 如何首先知道将数据发送回哪台机器,尤其是当它位于路由器后面时。
我不能相信像 udp 数据包中的唯一 ID 这样的东西 headers,因为它们总是可以伪造或被盗。
来自 UdpClient.Receive Method (IPEndPoint):
的文档
remoteEP
Type: System.Net.IPEndPoint
An IPEndPoint that represents the remote host from which the data was sent.
换句话说,只需使用 Receive()
方法传回给您的 IPEndPoint
值即可。这将是每个客户端的唯一 IP 地址和端口,您可以将其用作将数据报与您的客户端状态相匹配的密钥。
I am also curious how the TcpClient knows which machine to send data back to in the first place, especially if its sitting behind a router
连接的套接字维护有关远程端点的信息。如果客户端在 NAT 路由器后面,则远程端点 IP 地址和端口是路由器的,并且路由器有一个 table 将外部可见地址和端口映射到位于该路由器后面的客户端。参见 Network Address Translation。
我正在尝试弄清楚服务器如何区分通过 TCP 侦听器连接到它的多个客户端,并开始将 UDP 消息发送到 UdpClient。
TcpListner 使 TCP 变得容易,因为返回了一个 TcpClient,我可以附加到服务器上的特定客户端实例。但是,由于 UDP 是无连接协议,我现在将如何处理 UdpClient?我也很好奇 TcpClient 如何首先知道将数据发送回哪台机器,尤其是当它位于路由器后面时。
我不能相信像 udp 数据包中的唯一 ID 这样的东西 headers,因为它们总是可以伪造或被盗。
来自 UdpClient.Receive Method (IPEndPoint):
的文档remoteEP
Type: System.Net.IPEndPoint
An IPEndPoint that represents the remote host from which the data was sent.
换句话说,只需使用 Receive()
方法传回给您的 IPEndPoint
值即可。这将是每个客户端的唯一 IP 地址和端口,您可以将其用作将数据报与您的客户端状态相匹配的密钥。
I am also curious how the TcpClient knows which machine to send data back to in the first place, especially if its sitting behind a router
连接的套接字维护有关远程端点的信息。如果客户端在 NAT 路由器后面,则远程端点 IP 地址和端口是路由器的,并且路由器有一个 table 将外部可见地址和端口映射到位于该路由器后面的客户端。参见 Network Address Translation。