epoll,socket超时如何设置?

我的小丫丫 2012-05-22 11:43:20
在我的设计模型中,用到了传说中的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
...全文
1028 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
我的小丫丫 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

epoll_wait(int epfd, epoll_event events, int max events, int timeout)
[/Quote]
这个只是epoll_wait的timeout吧
root_jli 2012-05-22
  • 打赏
  • 举报
回复
epoll_wait(int epfd, epoll_event events, int max events, int timeout)
我的小丫丫 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

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

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

当连接数多了以后,遍历这样一个链表岂不是很费时


刚才在网上又搜到一个说是设置socket的SO_RCVTIMEO属性,在timeout的时候epoll_wait会返回这个fd的epoll_in,然后再读的时候出错,errono = 11

但我写了个小demo,好像没有效果
qq120848369 2012-05-22
  • 打赏
  • 举报
回复
1,设置socket非阻塞
2,设置epoll_wait超时1秒
3,每次进入epoll_wait之前,遍历在线用户列表,踢出长时间没有请求的用户.

PS:每次用户发来数据, read之后更新该用户last_request时间, 为了上面的步骤3而做.
我的小丫丫 2012-05-22
  • 打赏
  • 举报
回复
顶一下

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧