我正在使用epoll进行网络编程,看起来效果不错。我想添加一个超时函数,如果客户端长时间没有发送任何内容,那么它将断开与客户端的连接。
我该如何做?我知道可以在epoll_wait中设置超时时间,但这不是针对单个套接字的...
提前感谢您的帮助。
我该如何做?我知道可以在epoll_wait中设置超时时间,但这不是针对单个套接字的...
提前感谢您的帮助。
按照剩余时间(如果所有套接字的超时时间相同,则等价于按最后收到消息的时间进行排序),保持套接字列表排序。每次调用epoll_wait()
,选择剩余时间最短的套接字直到它超时(在列表的前面)。使用该时间作为epoll_wait()
中的超时时间。
当epoll_wait()
返回时,在处理任何活动套接字后,浏览已排序的套接字列表并修剪所有过期的套接字(这些套接字将位于排序列表的开头)。
epoll_wait()
时:
timeout = expirylist->expire_time - current_time();
n_events = epoll_wait(epfd, events, maxevents, timeout);
handle_events(events, n_events);
for (client = expirylist; client != NULL && client->expire_time < current_time(); client = client->expire_next)
{
do_timeout(client);
}
timerfd
并将其添加到 epoll 集合中。它将在您想要的任何时间唤醒您,此时您可以检查所有客户端连接并删除您认为已过期的连接。timer_create
。只需使用libevent*或类似的库,这将节省实现自己的队列和检查超时的工作。它还可以使您对epoll的使用更加容易,并且作为额外的好处,更具可移植性(比如说您想在没有epoll但有类似概念的kqueue的FreeBSD上运行应用程序)。
* 还有其他类似的库可供选择。
epoll_wait()
中的超时时间。请参见更新。 - caf