如何为每个选择()监视器的套接字设置不同的超时?

时间:2009-09-16 04:25:41

标签: c++ networking sockets

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

寻找线程;你不能用一个select()来完成这个任务。

答案 2 :(得分:0)

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

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

socket  last activity
  1        1950
  2        1990
  3        1500
  4        1998

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