イベントループを作成しようとしているようです(もしそうなら、libev btwを見てください)。 そこでは役に立ちません。自分で(またはたとえば)epoll
ソケットの非アクティブ状態を追跡してから、1秒間に数回ウェイクアップして、必要なものをすべてチェックする必要があります。clock_gettime()
gettimeofday()
いくつかの擬似コード
while (1) {
n = epoll_wait(..., 5);
if (n > 0) {
/* process activity */
} else {
/* process inactivity */
}
}
これにより、すべてのソケットが非アクティブの場合、1秒間に200回ウェイクアップします。
非アクティブチェックでは、最後に非アクティブだったタイムスタンプとともに、調査するソケットのリストが必要です。
struct sockstamp_s {
/* socket descriptor */
int sockfd;
/* last active */
struct timeval tv;
};
/* check which socket has been inactive */
for (struct sockstamp_s *i = socklist; ...; i = next(i)) {
if (diff(s->tv, now()) > 500) {
/* socket s->sockfd was inactive for more than 500 ms */
...
}
}
ここで、2秒のdiff()
差が得られ、現在のタイムスタンプが得られます。struct timeval
now()