首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >epoll和超时

epoll和超时
EN

Stack Overflow用户
提问于 2012-05-27 14:56:47
回答 2查看 8.4K关注 0票数 3

我使用epoll管理大约20到30个套接字。我发现epoll_wait可以用来等待一些数据通过其中一个套接字到达,但是我缺少如何在套接字级别实现超时。我可以在epoll_wait上使用超时,但它在我的情况下不是很有用。例如,如果我需要每次关闭一个超过500ms没有记录任何活动的套接字,或者可能会每隔200ms向套接字发送一些数据。如何使用epoll实现这些套接字级别超时?任何建议和想法都将不胜感激!

谢谢,Shivam Kalra

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-27 15:08:48

听起来您似乎正在尝试编写一个事件循环(如果是这样的话,请看一下libev btw)。epoll在这方面帮不了你,你必须自己跟踪套接字不活动(例如clock_gettime()gettimeofday() ),然后每秒唤醒几次并检查所需的一切。

一些伪代码

代码语言:javascript
复制
while (1) {
    n = epoll_wait(..., 5);
    if (n > 0) {
        /* process activity */
    } else {
        /* process inactivity */
    }
}

如果所有套接字都处于非活动状态,这将每秒唤醒您200次。

不活动检查需要一个要检查的套接字列表以及最后一次不活动的时间戳:

代码语言:javascript
复制
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()给出了当前时间戳。

票数 6
EN

Stack Overflow用户

发布于 2013-08-27 07:47:59

尝试将每个套接字与一个计时器fd对象(timerfd_create)配对。对于应用程序中的每个套接字,创建一个计时器,该计时器最初设置为在500ms后过期,并将计时器添加到epoll对象中(与套接字相同-通过epoll_ctlEPOLL_CTL_ADD)。然后,每当数据到达某个套接字时,将该套接字的相关计时器重新设置为500ms超时。

如果计时器超时(因为套接字处于非活动状态已有500ms),那么计时器将在epoll对象中变为"read ready“,并导致等待epoll_wait的任何线程被唤醒。然后,该线程可以处理定时器的关联套接字的超时。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10772208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档