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

时间:2021-05-09 11:40:28

标签: c tcp udp ip port

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

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

1 个答案:

答案 0 :(得分:0)

<块引用>

要实现此机制,必须具有绑定套接字以从特定客户端接收数据包的能力。

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

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

虽然无法仅 connect 到特定的客户端 IP。 recvfrom 需要 IP 和端口。如果客户端源端口事先未知,则可以创建一个未连接但绑定的 UDP 套接字,在其上调用 connect,然后 recvfrom 将套接字{{1} 返回的客户端 IP,port } (或创建一个新的绑定和连接的套接字)如果它是预期的客户端。