假设您有一个fd集,其中可以包含零个或多个套接字。当我尝试对空的fd集调用select操作时,得到的fds数量为-1,这意味着错误。因此,您建议如何解决该问题,您可能会说如果为空则不要调用,但是我有一个循环,并且fd set可以容纳0个或多个套接字。关于此问题的最佳方法是什么? (我们使用的是C编程语言)
最佳答案
那是不对的。您应该能够将0指定为集合中文件描述符的数量。实际上,这就是我记得在早期使用不带描述符的select
和适当设置超时值的超时代码的方式。
如果返回-1,则需要查看errno
以查看问题所在。
嗯,根据您的评论,WSAEINVAL
表示WinSock。那解释了你的问题。这是一种可怕的野兽,应该摆脱我们的苦难:-)
This page here指出,如果超时值无效或所有三个描述符参数都为空,则将获得WSAEINVAL
。稍后指出FD_ZERO
“将集合初始化为空集合”。我不知道最后一个代码段是否意味着该参数仍然被认为是NULL。假设您的超时没有问题(因为如果其中一组包含FD,则可以正常工作),可能就是这种情况。
我确实知道Berkeley套接字可以区分NULL FD集(即NULL指针)和空FD集(没有设置FD的有效指针)-WinSock可能没有那么多用途,特别是因为nfds
被忽略并且仅包含在其中与伯克利的兼容性。
我怀疑(尽管不确定)WinSock可能期望您不执行您想做的事情。可能只是假设您做错了什么,应该只对一个或多个FD集中的一个或多个套接字使用select
(因为对不带FD的select
的唯一使用是一个延迟,并且Windows有很多更好的方法延迟)。
关于c - 套接字选择带有空的fd集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2598335/