select多路复用的简单问题,但是非常困惑
在使用select来监听套接字是否有数据接收等等事件发生的时候,正常情况下返回就绪的文件描述符个数。并且在readfds、writefds和exceptfds中保留那些就绪的套接字描述符。如果是这样在大部分的多路复用的时候是不是可以如下使用
...
nRes = select(nSockMax + 1, &ReadFDs, 0, 0, &TimeOut);
...
for(int i = 0; i < ReadFDs.fd_count; i++)
{
ReadFDs.fd_array[i];//直接使用套接字读取数据
}
不知道这种用法是否合理,我在windows下使用发现这样做可行,但是不知道有没有别的问题?linux平台下没有测试过。
通常使用的方法是
for(int i = 0; i < nAllFdsCount; i++)
{
if (FD_ISSET(AllFds[i], &ReadFDs)
{
AllFds[i];//直接使用套接字
}
}
当被监听的套接字组的数量很大的时候,这样的循环是否会浪费CPU效率,但是几乎所有的例子里面都是这样写的。请高手指点一下第一种方法的问题在哪儿?