我使用epoll管理大约20到30个套接字。我发现epoll_wait可以用来等待一些数据通过其中一个套接字到达,但是我缺少如何在套接字级别实现超时。我可以在epoll_wait上使用超时,但它在我的情况下不是很有用。例如,如果我需要每次关闭一个超过500ms没有记录任何活动的套接字,或者可能会每隔200ms向套接字发送一些数据。如何使用epoll实现这些套接字级别超时?任何建议和想法都将不胜感激!
谢谢,Shivam Kalra
发布于 2012-05-27 15:08:48
听起来您似乎正在尝试编写一个事件循环(如果是这样的话,请看一下libev btw)。epoll在这方面帮不了你,你必须自己跟踪套接字不活动(例如clock_gettime()或gettimeofday() ),然后每秒唤醒几次并检查所需的一切。
一些伪代码
while (1) {
n = epoll_wait(..., 5);
if (n > 0) {
/* process activity */
} else {
/* process inactivity */
}
}如果所有套接字都处于非活动状态,这将每秒唤醒您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 */
...
}
}其中diff()给出了2 struct timevals的差值,now()给出了当前时间戳。
发布于 2013-08-27 07:47:59
尝试将每个套接字与一个计时器fd对象(timerfd_create)配对。对于应用程序中的每个套接字,创建一个计时器,该计时器最初设置为在500ms后过期,并将计时器添加到epoll对象中(与套接字相同-通过epoll_ctl和EPOLL_CTL_ADD)。然后,每当数据到达某个套接字时,将该套接字的相关计时器重新设置为500ms超时。
如果计时器超时(因为套接字处于非活动状态已有500ms),那么计时器将在epoll对象中变为"read ready“,并导致等待epoll_wait的任何线程被唤醒。然后,该线程可以处理定时器的关联套接字的超时。
https://stackoverflow.com/questions/10772208
复制相似问题