更多异步套接字问题:

时间:2011-03-08 23:23:40

标签: c++ sockets select asynchronous

初步问题here

所以我一直在阅读异步套接字,我还有几个问题。主要是具体的。

1:我可以使用带有select()的阻塞套接字而没有反响,对吗?

2:当我使用FD_SET()时,我附加当前的fd_set *而不是更改它,对吗?

3:使用FD_CLR()时,我可以简单地传入我想删除的套接字的套接字ID,对吗?

4:当我使用FD_CLR()移除套接字时,是否有一种重置最大文件描述符(nfds)的方法?

5:假设我的所有连接套接字都在向量中,当select()返回时,我可以通过该向量进行迭代并检查if (FD_ISSET (theVector[loopNum], &readFileSet)) 以查看是否需要读取任何数据,对吗?如果这返回true,我可以简单地使用我在同步套接字上使用的相同接收函数来检索该数据吗?

6:如果select()尝试从已关闭的套接字读取会发生什么?我知道它返回-1,但是它设置了errno还是有其他方式我可以继续使用select()?

7:你为什么这么棒? = d


感谢您的时间,对此感到头疼,我希望您能提供帮助!

2 个答案:

答案 0 :(得分:0)

  1. 不清楚? FD_SET将套接字插入集合中。如果套接字已经存在,则没有任何变化。
  2. FD_CLR从集合中移除套接字,如果套接字没有任何更改
  3. 您可以保留并行设置<>套接字,然后从那里获得最高价值。或者你可以设置一个bool说"重新扫描nfd然后再选择" (注意:在Windows上nfd被忽略)
  4. 正确
  5. 如果选择失败,快速解决方法是逐个迭代套接字并逐个选择()以查找虚假套接字。最好,你的代码不应该允许你已关闭的套接字上的select(),如果另一端关闭它,它就完全有效选择。
  6. 我需要让你和我的妻子谈谈。

答案 1 :(得分:0)

  

所以我一直在阅读异步套接字

根据以下内容判断我不认为你有。您似乎一直在阅读非阻塞套接字。不一样。

  

1:我可以使用带有select()的阻塞套接字而没有反响,对吗?

没有。考虑一个侦听套接字变为可读的情况,表示即将发生accept(),但同时客户端关闭连接。如果您再调用accept(),则会阻止 next 传入连接,从而阻止您为其他套接字提供服务。

  

2:当我使用FD_SET()时,我附加当前的fd_set *而不是更改它,对吗?

没有。你正在设置一下。如果它已经设置,则没有任何变化。

  

3:使用FD_CLR()时,我可以简单地传入我想删除的套接字的套接字ID,对吗?

正确。

  

4:当我使用FD_CLR()移除套接字时,是否有重置最大文件描述符(nfds)的首选方法?

不是真的,只需重新扫描并重新计算。但你实际上并不需要 来重置它。

  

5:假设我的所有连接套接字都在向量中,当select()返回时,我可以通过该向量进行迭代并检查是否(FD_ISSET(theVector [loopNum],& readFileSet))以查看是否有需要读取数据,对吗?

正确,但更常见的是迭代FD集本身。

  

如果这返回true,我可以简单地使用我在同步套接字上使用的相同接收函数来检索该数据吗?

阻止套接字上,是的。

  

6:如果select()尝试从已关闭的套接字读取,会发生什么?

select() '尝试从已关闭的套接字读取。它可能会尝试在已关闭的套接字上选择,在这种情况下,它将使用errno == EBADF返回-1,如文档中所述。

  

我知道它返回-1,但是它设置了errno还是有其他方式我可以继续使用select()?

见上文。