在接收消息时,使用select()继续计数超时?

时间:2014-11-15 03:57:02

标签: c linux sockets unix

select()在出错时返回-1,在超时时返回0,并在成功时返回集合中描述符的数量。

假设我们有以下伪代码:

while(1){
    int s = select(..., &timeout); //timeout = 5 sec

    if (s < 0) { perror(...); }

    else if(s == 0) { //timeout }

    else {
        //wait for some recv event or STDIN
    }
}

我认识到该过程要么等到超时,要么等到某个recv事件发生。

我需要让它在指定时间内保持计数,同时只使用select()从任意数量的对等体接收。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

在linux上,select系统调用将超时值减去经过的时间。 Posix允许但不需要这种行为,这使得很难依赖;便携式代码应假设timeout调用返回时未指定select的内容。

唯一真正可移植的解决方案是首先计算您希望超时到期的绝对时间,然后检查每次后续调用之前的时间以选择以计算正确的超时值。注意可能倒退(或向前跳过)的时钟; CLOCK_MONOTONIC通常是您最好的选择。