套接字选择空fd设置

who*_*hoi 2 c sockets select

假设你有一个fd集,其中可以有零个或多个套接字.当我尝试在空fd集上调用select操作时,得到的是-1作为设置的fds的数量,意味着错误.那么你会建议如何克服这个问题,你可能会说如果空的话不要调用但我有一个循环,任何时候fd set都可以容纳0个或更多的套接字.关于这个问题的最佳方法是什么?(我们使用的是C编程语言)

pax*_*blo 6

那是不对的.您应该能够将0指定为集合中的文件描述符数.实际上,这就是我记得在早期使用超时代码的方式,使用select没有描述符和适当设置的超时值.

如果它返回-1,你需要查看errno问题是什么.


啊,基于你的评论,WSAEINVAL意味着WinSock.这解释了你的问题.这是一个可怜的野兽,应该摆脱我们的痛苦:-)

此页面指出,WSAEINVAL如果超时值无效或者所有三个描述符参数均为空,您将获得.它后来声明FD_ZERO"将集合初始化为空集".是否最后一个片段意味着该参数仍被视为NULL,我不知道.假设您的超时是可以的(因为如果您在其中一个集合中有FD,它可以工作),情况可能就是这样.

我知道Berkeley套接字可以区分NULL FD集(即NULL指针)和空FD集(没有设置FD的有效指针) - WinSock可能不是那么通用,特别是因为它nfds被忽略并仅包含在兼容性中与伯克利.

我怀疑(虽然我不确定)WinSock可能会期待你不要做你想做的事情.它可能只是假设你做错了,应该select只用于一个或多个FD集中的一个或多个套接字(因为select没有FD的唯一用途是延迟,Windows有很多更好的延迟方法) .