首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更多异步套接字问题:

更多异步套接字问题:
EN

Stack Overflow用户
提问于 2011-03-08 23:23:39
回答 2查看 422关注 0票数 0

初始问题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:你为什么这么厉害?

我很感激你的时间,很抱歉让你头疼,希望你能帮上忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-08 23:31:05

  1. Yes
  2. Unclear?FD_SET将套接字插入到集合中。如果套接字已经存在,则没有任何changes.
  3. FD_CLR从集合中删除套接字;如果套接字没有任何更改,则可以保留一个并行的套接字set<>,然后从该套接字中获得最高值。或者,您可以设置一个bool,上面写着“在下一个选择之前对nfd进行重新扫描”(注意:在windows上,ignored)
  4. Correct
  5. If选择失败,快速修复是迭代套接字,然后对每个套接字逐一选择()来查找伪套接字。最优情况下,您的代码不应该允许在已关闭的套接字上选择select(),但如果另一端关闭,则完全可以选择。
  6. I需要让您与我的妻子交谈。
票数 0
EN

Stack Overflow用户

发布于 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()?

请参见上面的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5239586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档