【问题标题】:receiving udp packets from a specific client从特定客户端接收 udp 数据包
【发布时间】:2021-07-31 01:55:21
【问题描述】:

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

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

【问题讨论】:

  • 您的问题不清楚。请将您的代码显示为minimal reproducible example,描述它当前的功能,然后描述您需要它做什么而不是它没有做什么。
  • 帖子已编辑,希望现在更好。谢谢
  • 不,请不要只用文字描述代码。它几乎永远不够精确。请构建一个最小的可重现示例来说明上下文和问题。你的问题还是太不清楚了。 可能相关的一般信息:UDP 是一种无连接协议。单个 UDP 套接字可以从多个不同的客户端接收。不需要accept,因为这仅与基于连接的协议有关。
  • '绑定套接字以接收来自特定客户端的数据包的能力必须可用'是的,您可以使用 IP/port/userContext 的用户空间列表来做到这一点。

标签: c tcp udp ip port


【解决方案1】:

要实现这种机制,必须能够绑定套接字以接收来自特定客户端的数据包。

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

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

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

【讨论】: