假设您有一个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/

10-15 02:32