初始问题here
所以我一直在读异步套接字,还有几个问题。大多是混凝土。
1:我可以使用带有select()的阻塞套接字,而不会产生影响,对吗?
2:当我使用FD_SET()时,我是在追加当前的fd_set*,而不是更改它,对吗?
3:当使用FD_CLR()时,我可以简单地传递希望删除的套接字的套接字ID,对吗?
4:当我使用FD_CLR()删除套接字时,是否有一种预先设置Max文件描述符(nfds)的方法?
5:假设我的所有连接的套接字都在一个向量中,当select()返回时,我可以通过该向量进行itterate,并检查if (FD_ISSET (theVector[loopNum], &readFileSet)),看看是否需要读取任何数据,对吗?如果这返回true,我可以简单地使用同步套接字上使用的接收函数来撤回数据吗?
6:如果select()尝试从关闭的套接字读取,会发生什么情况?我知道它返回-1,但是它是设置errno还是有其他方法可以继续使用select()?
7:你为什么这么厉害?
我很感激你的时间,很抱歉让你头疼,希望你能帮上忙!
发布于 2011-03-08 23:31:05
发布于 2017-05-03 02:21:13
,所以我一直在读异步套接字
从接下来的情况来看,我不认为你有。你似乎一直在读关于非阻塞套接字的文章。不是一回事。
1:我可以使用带select()的阻塞套接字,对吗?
不是的。考虑监听套接字变得可读的情况,指示即将到来的accept(),但同时客户端关闭连接。如果然后调用accept(),您将一直阻塞到下一个传入连接,从而阻止您为其他套接字提供服务。
2:当我使用FD_SET()时,我是在追加当前的fd_set*,而不是改变它,对吗?
不是的。你正在设定一点。如果它已经设置好了,什么都不会改变。
3:当使用FD_CLR()时,我可以简单地传递希望删除的套接字的套接字ID,对吗?
对,是这样。
4:当我使用FD_CLR()删除套接字时,是否有一种首选的方法来重置Max (nfds)?
不完全是,只是重新扫描和重新计算。但你其实不需要重设它。
5:假设我的所有已连接的套接字都在一个向量中,当select()返回时,我可以通过该向量单独检查是否(FD_ISSET (theVectorloopNum,&readFileSet))来查看是否需要读取任何数据,对吗?
正确,但更常见的是迭代FD集本身。
如果返回
,那么我可以使用同步套接字上使用的相同的接收函数来恢复数据吗?
在你的阻塞插座上,是的。
6:如果select()尝试从关闭的套接字读取,会发生什么?
select()不尝试从关闭的套接字读取,它可能尝试选择关闭的套接字,在这种情况下,它将返回-1与errno == EBADF,如文档所述。
我知道它返回-1,但是它是设置errno还是有其他方法可以继续使用select()?
请参见上面的。
https://stackoverflow.com/questions/5239586
复制相似问题