我想知道是否有一种简单的方法可以遍历 fd_set?我想这样做的原因是不必遍历所有连接的套接字,因为 select() 将这些 fd_set 更改为仅包含我感兴趣的那些。我也知道,使用不打算直接访问的类型的实现通常是一个坏主意,因为它可能因不同的系统而异。但是,我需要一些方法来做到这一点,而且我的想法已经不多了。所以,我的问题是:
如何遍历 fd_set?如果这是一个非常糟糕的做法,除了遍历所有连接的套接字之外,还有其他方法可以解决我的“问题”吗?
谢谢
原文由 Andreas 发布,翻译遵循 CC BY-SA 4.0 许可协议
Select 设置与集合中文件描述符相对应的位,因此,如果您只对少数几个感兴趣(并且可以忽略其他),则无需遍历所有 fds 只需测试您感兴趣的那些文件描述符.
编辑
这是 fd_set 结构:
其中,fd_count 是设置的套接字数量(因此,您可以使用它添加优化),fd_array 是位向量(大小为 FD_SETSIZE * sizeof(int) ,取决于机器)。在我的机器中,它是 64 * 64 = 4096。
因此,您的问题本质上是:在位向量(大小约为 4096 位)中找到 1 的位位置的最有效方法是什么?
我想在这里澄清一件事:
“循环通过所有连接的套接字”并不意味着您实际上正在读取/对连接进行操作。 FD_ISSET() 仅检查 fd_set 中位于连接分配的 file_descriptor 编号的位是否已设置。如果效率是您的目标,那么这不是最有效的吗?使用启发式?
请告诉我们这种方法有什么问题,以及您试图使用替代方法来实现什么。