模拟 UDP 的accept()(设置多路分离的 UDP 套接字时的计时问题)

5 select udp

对于具有长期连接的 UDP 服务器架构,一种架构是使用一个套接字来侦听所有传入的 UDP 流量,然后使用 connect() 为每个连接创建单独的套接字以设置远程地址。我的问题是是否可以像accept() 对 TCP 所做的那样以原子方式完成此操作。

创建单独的套接字并使用 connect() 的原因是,这样可以轻松地将数据包处理分散到多个线程,并且还可以更轻松地将套接字直接与处理所需的数据结构相关联。网络堆栈中的多路分解逻辑会将传入数据包路由到最特定的套接字。

现在我的问题基本上是当一个人想像这样模拟 UDP 的accept() 时会发生什么:

  1. 将 select() 与包含 UDP 服务器套接字的 fd-set 一起使用。

  2. 然后从 UDP 服务器套接字读取数据包。

  3. 然后创建一个新的 UDP 套接字,然后将其连接到远程地址

  4. 我使用包含两个套接字的 fd-set 调用 select()。

  5. 返回什么?

假定数据包到达操作系统 1 和 3 之间的某个位置。

数据包会被多路分解到 UDP 服务器套接字,还是会被多路分解到 3 中创建的更具体的套接字。也就是说,多路分解在什么时候发生?当数据包到达时,还是必须“好像”到达第 4 点?

如果上述方法不起作用,则后续问题:执行此操作的最佳方法是什么?

nik*_*nik 0

这是行不通的。
您有两个简单的选择。

  1. 创建一个多线程程序,其中有一个“根”线程侦听 UDP 套接字,并根据源将接收到的数据包“分派”到正确的线程。这是因为您想按源隔离处理。

    • 扩展您的协议,以便源接受某个固定端口上的传入连接,然后继续协议通信。在这种情况下,您可以让源在标准 UDP 端口(您选择的)上发出请求,然后您的端将从新的 UDP 套接字响应源的 UDP 端口。这样,您就启动了一条从您端向后到每个源的已知 UDP 端口的新 UDP 路径。这样你的终端就有了不同的 UDP 套接字。