gpt4 book ai didi

c - 带有空 fd 集的套接字选择

转载 作者:行者123 更新时间:2023-12-02 07:52:56 26 4
gpt4 key购买 nike

假设您有一个 fd 集,其中可以有零个或多个套接字。当我尝试在空 fd 集上调用 select 操作时,我得到的是 -1 作为设置的 fd 的数量,这意味着错误。那么你会建议什么来克服这个问题,你可能会说如果空就不要调用但我有一个循环并且任何时候 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 被忽略并包含在内只是为了与 Berkeley 兼容。

我怀疑(尽管我不确定)WinSock 可能希望您不要做您想做的事情。它可能只是假设你做错了什么,应该只对一个或多个 FD 集中的一个或多个套接字使用 select(因为 select 只用于没有 FD 就是延迟,Windows 有很多更好的延迟方法。

关于c - 带有空 fd 集的套接字选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2598335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com