【发布时间】:2011-04-09 08:16:01
【问题描述】:
我想知道是否有一种简单的方法可以遍历 fd_set?我想这样做的原因是不必遍历所有连接的套接字,因为 select() 将这些 fd_set 更改为仅包含我感兴趣的那些。我也知道,使用不打算直接访问的类型的实现通常是一个坏主意,因为它可能因不同的系统而异。但是,我需要一些方法来做到这一点,而且我的想法已经不多了。所以,我的问题是:
如何遍历 fd_set?如果这是一个非常糟糕的做法,除了遍历所有连接的套接字之外,还有其他方法可以解决我的“问题”吗?
谢谢
【问题讨论】:
-
强调我的意思。我不想使用 FD_ISSET 方法,因为它需要我遍历所有连接的套接字。但是,根据定义,select() 从集合中删除不相关的文件描述符,所以我想遍历集合。
-
不一定表示“全部连接”。您可以将连接的套接字的子集传递给 select,然后在 select 返回后仅在该子集上使用 FD_ISSET。另外,循环遍历所有这些是否存在实际问题?除非您要处理数千个连接的套接字,否则循环可能会花费一些无关紧要的时间。
-
同意拉基斯。这是看起来效率低下的事情之一,但在大多数情况下实际上并非如此。通过循环的时间将与仅服务一组 FD 所花费的时间相比相形见绌。
-
@Andreas: 10000 个打开的连接并且所有的事务都是串行处理的?
-
@Andreas:你这里的东西叫做瓶颈。至少可以说,除了 FD_ISSET 变慢之外,还有其他可能出错的事情。只需在几个调度程序线程之间划分连接即可。
标签: c++ c select file-descriptor