【问题标题】:How to set different timeouts for each socket that select() monitors?如何为 select() 监控的每个套接字设置不同的超时时间?
【发布时间】:2010-11-28 16:36:16
【问题描述】:

我目前正在使用 BSD 套接字 API。我想使用 select() 函数来监视 (a) 使用 accept() 等待新连接的侦听器套接字,以及 (b) 所有客户端套接字通过 accept() 或 connect() 创建。我希望侦听器套接字没有任何超时,并且我希望每个客户端套接字的超时时间为 120 秒。

这可以使用 select() 函数吗?它只接受所有套接字的单个超时值,所以我的假设是否定的。如果是这样,我是否注定要制作一个每个套接字在自己的线程中以阻塞模式运行的服务器?

【问题讨论】:

    标签: c++ networking sockets


    【解决方案1】:

    为什么不做这十年的设计并使用 libevent?

    【讨论】:

      【解决方案2】:

      由于select() 函数的逻辑,你应该将你的函数的最小超时传递给它。如果达到此最小超时,则相应的套接字超时,您应该处理这种情况。换句话说,具有更大超时时间的套接字永远不会超时,因为它们只是没有机会:时间是从最后一个 select() 调用开始计算的,而不是第一个调用。

      寻找线程;你不能用一个select()来做到这一点。

      【讨论】:

      • 好的,在自己的线程中以阻塞模式运行它们实际上是我已经拥有的方式,并且它实际上工作正常,但我被引导相信这不是“最佳实践”。如果这是做我想做的事的唯一方法,那么我会保持原样。
      【解决方案3】:

      您需要自己跟踪剩余超时,并将最小超时传递给select()

      例如,假设您希望侦听套接字没有超时,并且每个连接的超时时间为 10 分钟(超时 = 600 秒)。对于每个连接,以秒为单位跟踪该套接字上最后一个活动的时间,如下所示:

      套接字最后一个活动 1 1950 2 1990 3 1500 4 1998

      然后每个套接字的剩余超时时间可以计算为last + timeout - curtime,因此如果当前时间为 2000(秒),则每个连接的剩余超时时间分别为 550、590、100 和 598。其中最小值为 100,因此下次您将在没有其他活动的情况下出现超时条件,因此请将其传递给 select() 函数。如果select() 超时过期,那么当您重新计算每个套接字的剩余超时时间时,您会发现哪些套接字已超时。

      【讨论】:

      • 请注意,如果您将所有时间值保留为 64 位整数,并且仅在将 timeval 结构传递给选择()。
      猜你喜欢
      • 2014-01-30
      • 2012-01-15
      • 2020-07-16
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多