我正在尝试使用 TCP 中的“接受”功能来实现 UDP 服务器。那是因为我需要为每个客户保留一个频道。我的问题是如何让UDP套接字从特定客户端(特定客户端的IP和端口)接收数据?
TCP 使用一个主 Socket(在一个线程内)来接收来自客户端的请求。一旦来自客户端的请求到来,主套接字就会打开另一个套接字以与该客户端进行通信(在另一个线程中)。要实现此机制,必须具有绑定套接字以从特定客户端接收数据包的能力。这种能力正是我所要求的。如何为 UDP 套接字重新实现“接受”功能?其中(据我所知)不可能绑定 Socket 以从特定客户端接收。我的问题是如何使它成为可能?
答案 0 :(得分:0)
要实现此机制,必须具有绑定套接字以从特定客户端接收数据包的能力。
bind
没有指定可以连接的远程客户端,而是指定数据应该发送到的本地地址。这在 UDP 中与在 TCP 中相同。在 TCP 中不可能accept
只accept
一个特定的客户端,但是可以bind
一个连接,然后如果它是错误的客户端就关闭它。
使用 UDP 可以connect
一个套接字来接收本地 IP 和端口上的数据。可以另外connect
UDP 套接字以仅从特定客户端 IP 和端口获取数据。请注意,这与 TCP 中的 connect
不同:在 TCP 中,它主动建立连接(即在 TCP 握手期间交换数据包),而在 UDP 中,它仅设置套接字上的对等地址。
虽然无法仅 connect
到特定的客户端 IP。 recvfrom
需要 IP 和端口。如果客户端源端口事先未知,则可以创建一个未连接但绑定的 UDP 套接字,在其上调用 connect
,然后 recvfrom
将套接字{{1} 返回的客户端 IP,port } (或创建一个新的绑定和连接的套接字)如果它是预期的客户端。