gpt4 book ai didi

c - 多个 select() 来监视多个 FD_SET

转载 作者:行者123 更新时间:2023-11-30 14:23:44 26 4
gpt4 key购买 nike

我不是网络编程专家。我基本上有两种客户,他们有不同的超时时间。我应该使用带有连接套接字的 UDP 来进行客户端-服务器通信。

问题是双重的:

a) 无论哪个客户端(或者套接字)在 t1 秒内没有响应,我都需要将其标记为死亡。如果 read_fd_set 中的套接字在超时值内没有任何内容可读取,则使用 select 将会超时。那么,如何使某个相当长一段时间没有数据可读取的套接字超时呢?

  • 目前,每当 select 返回时,我自己都会跟踪哪些套接字正在响应,哪些没有响应。我将 t1.tu_sec 添加到每个客户端(套接字)的单独消耗时间中。然后,我手动关闭并从 FD_SET 中排除在 (n) * (t1.tu_sec) 时间内没有响应的套接字。这是一个足够好的方法吗?

b) 主要问题是有两种客户端具有不同的超时,t1 和 t2。我该如何处理这个问题?

  • 我可以在同一个循环中为两种客户端使用两个 select() 吗?没有线程会导致饥饿吗?在这种情况下,使用线程是否可取(甚至是必需)?

我已经在网络上漫游多年了!

非常感谢任何帮助。

最佳答案

这只是一个非常常见模式的特殊情况,其中选择/轮询循环与计时器集合相关联。

您可以使用任务优先级队列,按下一个(绝对)触发时间排序;选择超时始终只是队列前面的绝对时间。

  • 当 select 超时时(并且在下一次迭代之前,如果您的任务可能需要很长时间才能完成),获取当前时间,将应该已经执行的每个任务从队列中拉出,然后执行它
  • (某些)任务需要重新安排,因此请确保在执行此操作时它们可以改变优先级队列

那么你的逻辑就很简单了:

  • 读取时,将套接字标记为忙碌
  • 在计时器执行时,将套接字标记为空闲
    • 如果它已经空闲,则意味着自上次计时器到期以来没有收到任何信息:它已经死了

关于c - 多个 select() 来监视多个 FD_SET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12600155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com