对于具有长期连接的 UDP 服务器架构,一种架构是使用一个套接字来侦听所有传入的 UDP 流量,然后使用 connect() 为每个连接创建单独的套接字以设置远程地址。我的问题是是否可以像accept() 对 TCP 所做的那样以原子方式完成此操作。
创建单独的套接字并使用 connect() 的原因是,这样可以轻松地将数据包处理分散到多个线程,并且还可以更轻松地将套接字直接与处理所需的数据结构相关联。网络堆栈中的多路分解逻辑会将传入数据包路由到最特定的套接字。
现在我的问题基本上是当一个人想像这样模拟 UDP 的accept() 时会发生什么:
将 select() 与包含 UDP 服务器套接字的 fd-set 一起使用。
然后从 UDP 服务器套接字读取数据包。
然后创建一个新的 UDP 套接字,然后将其连接到远程地址
我使用包含两个套接字的 fd-set 调用 select()。
返回什么?
假定数据包到达操作系统 1 和 3 之间的某个位置。
数据包会被多路分解到 UDP 服务器套接字,还是会被多路分解到 3 中创建的更具体的套接字。也就是说,多路分解在什么时候发生?当数据包到达时,还是必须“好像”到达第 4 点?
如果上述方法不起作用,则后续问题:执行此操作的最佳方法是什么?
这是行不通的。
您有两个简单的选择。
创建一个多线程程序,其中有一个“根”线程侦听 UDP 套接字,并根据源将接收到的数据包“分派”到正确的线程。这是因为您想按源隔离处理。
| 归档时间: |
|
| 查看次数: |
2927 次 |
| 最近记录: |