【发布时间】:2009-06-30 16:10:50
【问题描述】:
对于具有长期连接的 UDP 服务器架构,一种架构是拥有一个侦听所有传入 UDP 流量的套接字,然后使用 connect() 为每个连接创建单独的套接字来设置远程地址。我的问题是,是否有可能像 accept() 对 TCP 所做的那样以原子方式执行此操作。
创建单独的套接字并使用 connect() 的原因是,这样可以很容易地将数据包处理分散到多个线程中,并且也可以更容易地使套接字直接与所需的数据结构相关联加工。 网络堆栈中的多路分离逻辑将传入的数据包路由到最具体的套接字。
现在我的问题基本上是当人们想像这样模拟 UDP 的 accept() 时会发生什么:
将 select() 与包含 UDP 服务器套接字的 fd 集一起使用。
然后从 UDP server-socket 读取一个数据包。
然后创建一个新的 UDP 套接字,然后将其 connect() 到远程地址
我使用包含两个套接字的 fd-set 调用 select()。
返回什么?
假设数据包在 1 到 3 之间到达操作系统。
数据包会被解复用到 UDP 服务器套接字,还是会被解复用到在 3 中创建的更具体的套接字。也就是说,解复用发生在什么时候?当数据包到达时,还是必须“好像”它到达第 4 点?
如果上述方法不起作用,后续问题:最好的方法是什么?
【问题讨论】:
-
你确定你甚至可以创建一个连接到另一端的新 UDP 套接字,并且仍然保持相同的服务器端端口吗?您通常做的是在服务器端的不同端口上创建一个 UDP 套接字,“服务器套接字”仅用于初始请求,与对等方的进一步通信发生在 2 个完全不同的端口上。或者只是在服务器上使用 1 个套接字,而不关心连接它,你只需要记下对等地址。 UPD 无论如何都是无连接的。