【问题标题】:More asynchronous socket questions:更多异步套接字问题:
【发布时间】:2011-03-08 23:23:39
【问题描述】:

初始问题here

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

1:我可以使用带有 select() 的阻塞套接字而不会产生任何影响,对吗?

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

3:当使用 FD_CLR() 时,我可以简单地传递我希望删除的套接字的套接字 ID,对吧?

4:当我使用 FD_CLR() 删除套接字时,是否有一种重置 Max File Descriptor (nfds) 的首选方法?

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

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

7:你为什么这么厉害? =D


感谢您抽出宝贵的时间,很抱歉让您头疼,希望您能帮上忙!

【问题讨论】:

    标签: c++ sockets select asynchronous


    【解决方案1】:
    1. 是的
    2. 不清楚? FD_SET 将一个套接字插入到集合中。如果套接字已经存在,则不会发生任何变化。
    3. FD_CLR 从集合中删除一个套接字,如果套接字不存在,则没有任何改变
    4. 您可以保留一组并行 套接字,然后从那里获得最高值。或者你可以设置一个布尔值“在下一次选择之前重新扫描 nfd”(注意:在 windows 上 nfd 被忽略)
    5. 正确
    6. 如果选择失败,快速解决方法是迭代套接字并在每个套接字上逐个 select() 以找到虚假的套接字。理想情况下,您的代码不应允许在 已关闭的套接字上选择(),但如果另一端已关闭,则选择打开是完全有效的。
    7. 我需要让你和我妻子谈谈。

    【讨论】:

    • 谢谢埃里克!到目前为止,我真的很感谢你们所有人的帮助!我现在就回去工作=D
    • (1) 不正确。 (6) 中的“速战速决”是绝望的忠告。我们的想法不是一开始就在您的代码中构建这样的错误。
    • @EJP:你认为阻塞套接字上的选择问题是什么?
    【解决方案2】:

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

    从下面的内容来看,我认为你没有。您似乎一直在阅读有关 非阻塞 套接字的信息。不是一回事。

    1:我可以使用带有 select() 的阻塞套接字而不会产生任何影响,对吗?

    没有。考虑一个监听套接字变得可读的情况,表明一个即将到来的accept(),但同时客户端关闭了连接。如果您随后调用accept(),您将阻塞直到下一个传入连接,从而阻止您为其他套接字提供服务。

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

    没有。你设置了一点。如果已设置,则不会发生任何变化。

    3:当使用 FD_CLR() 时,我可以简单地传递我希望删除的套接字的套接字 ID,对吧?

    正确。

    4:当我使用 FD_CLR() 删除套接字时,是否有重置 Max File Descriptor (nfds) 的首选方法?

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

    5:假设我将所有连接的套接字都放在一个向量中,当 select() 返回时,我可以遍历该向量并检查是否 (FD_ISSET (theVector[loopNum], &readFileSet)) 以查看是否需要任何数据阅读,对吗?

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

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

    在您的阻塞套接字上,是的。

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

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

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

    见上文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 2011-03-30
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      相关资源
      最近更新 更多