日期:2014-05-16  浏览次数:20608 次

epoll,socket超时如何设置?
在我的设计模型中,用到了传说中的epoll,原来的方式是阻塞式的一个线程一个socket,在recv的时候设置recv的超时,如果超时,就将socket断掉,认为接收不成功。
现在改为epoll,非阻塞式的,在epoll_wait返回的fd中,一旦在recv任何一个fd的时候返回非0的error时,立即将从socket收到的数据放入cache list中,等待epoll_wait再次返回fd的时候,先从cahe list中查找fd存在这个list中没,如果没有就从包头开始接收,如果有,就继续上次接收的地方开始。send发消息到客户端的时候也是如此这般
但是现在遇到一个问题,我应该在哪里设置socket接收的超时,或者send的超时,因为现在recv和send没有timeout了
我该从哪里设置。或者说我在等客户端的socket发送一个指定消息的时候在timeout之内没收到,如何主动断开socket

------解决方案--------------------
1,设置socket非阻塞
2,设置epoll_wait超时1秒
3,每次进入epoll_wait之前,遍历在线用户列表,踢出长时间没有请求的用户.

PS:每次用户发来数据, read之后更新该用户last_request时间, 为了上面的步骤3而做.