从特定客户端接收 udp 数据包

receiving udp packets from a specific client

我正在尝试实现像 TCP 中那样具有“接受”功能的 UDP 服务器。那是因为我需要为每个客户保留一个频道。我的问题是如何让UDP套接字从特定客户端(特定客户端的ip和端口)接收数据?

TCP 使用主套接字(在线程内)接收来自客户端的请求。一旦来自客户端的请求到来,主套接字打开另一个套接字与该客户端通信(在另一个线程内)。要实现此机制,必须能够绑定套接字以从特定客户端接收数据包。这种能力正是我所要求的。如何为 UDP 套接字重新实现“接受”功能?在哪里(据我所知)无法绑定套接字以从特定客户端接收。我的问题是如何让它成为可能?

To implement this mechanism, the ability to bind socket to receive packets from a specific client must be available.

bind 没有指定可以连接的 remote 客户端,而是指定了应该发送数据的 local 地址到。这在 UDP 中与在 TCP 中相同。在 TCP 中不可能只 accept 一个特定的客户端,但是可以 accept 一个连接,然后如果它是错误的客户端就简单地关闭它。

使用 UDP,可以 bind 套接字在本地 IP 和端口上接收数据。还可以 connect UDP 套接字仅从特定客户端 IP 和端口获取数据。请注意,这与 TCP 中的 connect 不同:在 TCP 中,它主动建立连接(即在 TCP 握手期间交换数据包),而在 UDP 中,它仅在套接字上设置对等地址。

虽然 connect 仅针对特定客户端 IP 是不可能的。 connect 需要 IP 和端口。如果事先不知道客户端源端口,可以创建一个未连接但绑定的 UDP 套接字,在其上调用 recvfrom 然后 connect 套接字到客户端 IP,端口由 [=18= 返回](或创建一个新的绑定和连接的套接字)如果它是预期的客户端。