如何仅循环 select() 的 fd_set 结果中的活动文件描述符?

2024-03-17

所以在我当前的服务器实现中,目前是这样的:

  void loop(){
     // step 1: clear set

     fd_set readfds;

     while(true){

        // step 1:
        FD_ZERO(readfds);

        // step 2:
        loop_through_sockets_and_add_active_sockets_to(theset);

        // step 3:
        switch(select(FD_SETSIZE, &readfds, 0, 0, &tv)) {
           case SOCKET_ERROR:
              patia->receiveEvent(Error, net::getError());
              return;
           case 0:
              return;
        }

        // step 4:
        loop through sockets and check, using FD_ISSET, 
        which read fd's have incoming data.

     }
  }

现在,不清除 fd_set(仅在添加/删除通道时使用 FD_SET、FD_CLR)将是更好的方法。

我的问题是,如何在 select() 之后循环遍历 fd_set,而不检查集合的每个成员是否是集合的一部分,而不使用 FD_ISSET?

我的意思是,当您有 4000 个活动连接时,每当有传入数据时,上述循环都必须经过潜在的 4000 个套接字才能到达正确的套接字。如果所有线程都非常活跃,那么复杂度将是 n^2!


我的问题是,如何在 select() 之后循环遍历 fd_set,而不检查集合的每个成员是否是集合的一部分,而不使用 FD_ISSET?

你不能。

有一个轻微的优化select()返回就绪描述符的数量,因此,如果您记录已处理的数量,则当您知道已完成所有描述符时,可以停止,而无需到达集合的末尾。

我的意思是,当您有 4000 个活动连接时,每当有传入数据时,上述循环都必须经过潜在的 4000 个套接字才能到达正确的套接字。如果所有线程都非常活跃,那么复杂度将是 n^2!

我不明白你从哪里得到 O(n^2) 。当然,从回来后select()一旦处理完途中的每个就绪描述符,您就会遍历该集合。如果您有 4,000 个就绪 IO 描述符,则循环遍历内存中 4,000 个 C 对象的数组的开销将相当微不足道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅循环 select() 的 fd_set 结果中的活动文件描述符? 的相关文章

随机推荐

  • 从逗号或制表符分隔的文本文件中读取

    我需要从可以用逗号或制表符分隔的文件中读取数据 我现在有一个函数 getcsv 但它只接受一个可能的分隔符 有什么想法如何处理这个问题吗 Thanks 从 PHP 5 3 开始 您可以使用str getcsv http php net ma
  • Mac PyQt5 菜单栏在取消焦点重新聚焦应用程序之前不会激活

    我在 Mac 中使用 PyQt5 创建 Qt 菜单栏时遇到问题 我遇到的问题是菜单栏会显示 但直到我取消应用程序的焦点 通过单击其他应用程序 然后再次重新聚焦 Qt 应用程序时才会做出反应 这是我的环境 操作系统 塞拉利昂 10 12 Py
  • python类中私有变量的实际实现[重复]

    这个问题在这里已经有答案了 可能的重复 Python 中对象名称前的单下划线和双下划线的含义 https stackoverflow com questions 1301346 the meaning of a single and a d
  • h2o.glm 与 R 中的线性回归的 glm 不匹配

    我一直在将 H2O ai 版本 3 10 3 6 与 R 结合使用 我正在努力用 h2o glm 复制 glm 的结果 我期望得到完全相同的结果 在这种情况下 根据均方误差进行评估 但我发现 h2o 的准确性一定更差 由于我的模型是高斯模型
  • 使用 CSS 影响 iframe 内的 div 样式

    是否可以仅使用 CSS 来更改驻留在页面 iframe 内的 div 的样式 你需要 JavaScript 它与在父页面中执行此操作相同 只是您必须在 JavaScript 命令前加上 iframe 的名称 请记住 同源策略适用 因此您只能
  • Java中JTextArea的自动动态扩展/收缩

    我首先创建一个特定大小的 JTextArea 用户可以在其中添加文本 但如果文本太长 垂直或水平 则会被截断 我希望 JTextArea 自动扩展或收缩 用于删除文本 我将来可能允许用户更改字体和字体大小 因此如果我可以避免使内容增加 减少
  • C# 和 WPF - 使用 SecureString 作为客户端 HTTP API 密码

    在编写 WPF 应用程序时 PasswordBox将输入的密码存储为SecureString 这完全有道理 但是 我想通过 HTTP API 发送密码 并且HttpClientPostAsync 似乎接受表单编码数据的字符串 我知道其他人也
  • CheckedListBox - 通过文本搜索项目

    我有一个CheckedListBox绑定到一个DataTable 现在我需要以编程方式检查一些项目 但我发现SetItemChecked 方法仅接受项目索引 有没有一种实用的方法可以在不知道项目索引的情况下通过文本 标签获取项目 注意 我对
  • 无法在 Linux 上安装 sqldf

    我在 Linux 上运行 R 版本 2 14 1 当我尝试安装 sqldf 时 install packages sqldf dependencies TRUE 我收到以下错误 这些错误导致从终端运行命令 就像使用 Rcmdr UI 一样
  • mongoDB 错误:错误:无法连接到 [localhost:27017]

    我正在尝试安装habitrpg https github com busterroni habitrpg在本地 但我在输入后不断收到 mongoDB 错误node src seed js Error failed to connect to
  • C# Mono Linux - 抓取全局剪贴板的内容

    我试图简单地从剪贴板 抓取 文本并将其放入变量中 我在做这件事时遇到了很多麻烦 我尝试过使用 Gtk Clipboard Get Gdk Atom Intern PRIMARY true 到目前为止 我的代码只是将 Gtk Clipboar
  • youtube-api removeEventListener 不工作

    我可以很好地添加事件 addEventListener onStateChange handleStateChange 但当尝试删除该事件时 却没有 removeEventListener onStateChange handleState
  • 获取当前位置div的ID

    我有n个 section 在一个页面中 每个页面都提供了 id 例如 page1 page2 在顶部我放置了 2 个按钮 即 上一个 和 下一个 当按下上一个按钮时 它将滚动到上一个 section 与下一个类似 section 按 下一步
  • JAX-WS - 添加 SOAP 标头

    我正在尝试创建一个独立的客户端来使用一些网络服务 我必须将我的用户名和密码添加到 SOAP 标头中 我尝试添加凭据 如下所示 OTSWebSvcsService service new OTSWebSvcsService OTSWebSvc
  • Facebook 应用程序请求通知未显示在移动网络应用程序的 Facebook iOS 应用程序中

    我有一个配置为 Facebook 画布应用程序的 Facebook 应用程序以及一个包含网站和移动网站 URL 的网站 当应用程序发送应用程序请求 邀请 时 它们仅显示在桌面浏览器中的收件人通知中 而不显示在 Facebook iOS 应用
  • Firebase DatabaseReference 按指定值过滤

    假设我有这个 firebase JSON 结构 我需要获取属性 from 等于 this 的所有问题 我知道我可以使用 Volley 来创建 StringRequest 并从我的 questions json 中获取所有值 然后 在客户端
  • 如何让服务帐户只能访问一个存储桶(Google Cloud)?

    如何提供服务帐号只能访问一个桶 如果你以防万一想再给一个第3方服务访问您的private bucket 问题是默认的 服务帐户 可以访问所有存储桶 但我不知道如何将其限制为仅限一个存储桶 是否可以通过仪表板或仅通过控制台来实现此目的 如果可
  • 向样式组件添加过渡

    我在 React 中有以下组件 const Button styled div width 30px height 30px position absolute right 2em top 50 transform translateY 5
  • 使用秒表分析 .NET 应用程序

    似乎没有免费的 NET 性能分析器可以逐行进行分析 因此 我正在考虑使用秒表进行分析 免费即自由 即许可证包括商业应用程序 编辑 为了回应那些告诉我 购买分析器 的人 我愿意 但如果我能花那么多钱 我会把它花在其他东西上 我试图让我的老板相
  • 如何仅循环 select() 的 fd_set 结果中的活动文件描述符?

    所以在我当前的服务器实现中 目前是这样的 void loop step 1 clear set fd set readfds while true step 1 FD ZERO readfds step 2 loop through soc