c - 在接收消息时继续使用 select() 计算超时?

标签 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() 从任意数量的对等方接收数据。

我怎样才能做到这一点?

最佳答案

在 Linux 上,select 系统调用将超时值减去耗时量。 Posix 允许但不要求这种行为,这使得它很难依赖;可移植代码应假定 select 调用返回时未指定 timeout 的内容。

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

关于c - 在接收消息时继续使用 select() 计算超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942355/

相关文章:

c - g_timeout_add : return value is always 0

c - 发送到:无效参数

linux - Redmine RailsBaseURI

Java SocketServer 正在接受来自 Socket 客户端的输入,但 Socket 客户端未接收来自 SocketServer 的输入

python - 如何重载 python 中的内置模块?

c - 用函数 B 覆盖弱函数 A

c - 在 C 中使用按位运算符查找 x 是否大于 y

php - WordPress 网站迁移后缺少仪表板

java - JNA 用字符串代替 int 进行 chown?

java - Android Socket ReadLine 但具有不同的终止符