【发布时间】:2021-08-05 00:52:32
【问题描述】:
UDP 套接字有一个“连接”调用,但没有对服务器应用程序的“接受”调用。有一些套接字 API 可以从连接的 UDP 套接字(例如 recvmmsg/sendmmsg)中获得性能优势,并且是具有非常高数据包速率的单流的最佳性能系统调用(任何更高的东西都需要内核绕过,例如DPDK)。
无论如何,我找不到为 UDP 服务器实现接受的解决方案,所以我的想法是执行以下操作:
- 服务器套接字一直监听直到收到来自客户端的数据包
- 服务器在套接字上调用 connect,从而允许使用加速连接的 API 将流量发送到客户端(即连接的
sendmmsg超过未连接的sendmmsg) - 服务器侦听 #1 的克隆套接字
为了解决接受的事情,我不知道如何克隆#1。我的“服务器”库的用户正在传递一个套接字文件描述符,这意味着他们可以控制他们配置的选项(SO_RECVBUFF 等)——我看不到它。不幸的是,为了克隆它,我现在需要这种可见性。
无论如何,如果有另一种方法来解决接受的事情,或者克隆套接字,我很想知道!谢谢!
【问题讨论】:
-
你在使用多播吗?否则,同一端口上的多个 UDP 套接字的行为可能无法预测。
-
socket(7)手册页列出了可用的套接字选项,以及如何获取或设置它们。 -
这气味like an XY problem。你想解决什么问题?不,不是关于克隆套接字的问题,而是您认为解决方案是克隆套接字的问题,所以这就是您要问的问题。也许如果真正的问题得到了解释,一个更简单的解决方案将成为可能。
-
@Gabe 您将 TCP 上下文中的“连接”语义与 UDP 中的“连接”混淆了。 TCP 在设计上是一个面向连接的协议,因此 TCP 中的“连接”实际上是建立一个连接,而实际上接受连接的原始端口保持不变。 UDP 是无连接 - 从来没有连接。当您发送 UDP 数据包时,它完全独立于所有其他数据包,并且仅针对 IP/端口组合。 TCP 是一个电话呼叫 - 您呼叫并建立连接。 UDP 是一封信——谁去那个地址的邮箱,谁就得到它。