免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 15203 | 回复: 41
打印 上一主题 下一主题

socket 超时问题如何解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-24 12:55 |只看该作者 |倒序浏览
描述一下, 一个服务器被多个客户端连接,当客户端不发数据的时候, 如何在超时的时候发现它呢?

环境epoll

目前使用了setsockopt ( SO_RCVTIMEO),

然后进行recv操作,发现如果超时epoll 并不会返回。

目前的做法是,其他线程,定时去扫描已经建立连接的socket ,自己逻辑处理,这样的效率很低的。

论坛徽章:
0
2 [报告]
发表于 2008-07-24 13:06 |只看该作者
搞个心跳报文试试

论坛徽章:
0
3 [报告]
发表于 2008-07-24 13:18 |只看该作者
自己的心跳报文 不能解决的。 你发过去,他收了。

他不回,你怎么办

论坛徽章:
0
4 [报告]
发表于 2008-07-24 13:47 |只看该作者
不回就咔嚓掉

论坛徽章:
0
5 [报告]
发表于 2008-07-24 14:01 |只看该作者
卡卡谁不会啊

还是那个问题, 你如何知道他没有回?
recv 并不返回,send 成功。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2008-07-24 14:15 |只看该作者
原帖由 maxmaxsh 于 2008-7-24 12:55 发表
描述一下, 一个服务器被多个客户端连接,当客户端不发数据的时候, 如何在超时的时候发现它呢?

环境epoll

目前使用了setsockopt ( SO_RCVTIMEO),

然后进行recv操作,发现如果超时epoll 并不会返回 ...



为什么会说效率低. 既然你是select 说明你的压力不大. 超不过1024. 那么遍历1000个会话, 嗖地就完了.
不要盲目追求效率

libevent 有你要的功能.你可以参考一下源码..但对我来说那不是一个好方法.还不如拿定时器去检测, 不要影响select

论坛徽章:
0
7 [报告]
发表于 2008-07-24 14:21 |只看该作者
epoll
连接少直接单连接单线程就完成了。

论坛徽章:
0
8 [报告]
发表于 2008-07-24 14:48 |只看该作者
你是长连接还是短连接?

论坛徽章:
0
9 [报告]
发表于 2008-07-24 15:08 |只看该作者
当然是长连接了。

对付的就是,别人开个 telnet 上来,然后人走开这种情况。


如果epoll没有返回到结果, 我直接close掉,会不会有问题?

我目前就这么做,也没发现不好。

论坛徽章:
0
10 [报告]
发表于 2008-07-24 15:10 |只看该作者
没懂,像前面的人说的发送心跳包的策略为什么不可以?如果client针对某个心跳包也发送了自己的回复,那么就继续存活,否则close掉连接.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP