免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: guochgz
打印 上一主题 下一主题

[C] 测试服务器出现很奇怪的问题。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-04-28 10:16 |只看该作者

回复 #7 converse 的帖子

他的意思应该是客户端发送成功了,但是服务端此时还收不到数据,当客户端close时候才能收到刚发的数据和对方的close
自己认为的,

论坛徽章:
0
12 [报告]
发表于 2008-04-28 10:21 |只看该作者

回复 #7 converse 的帖子

很抱歉,没有表达清楚。

是这样的,现在测试到的情况是这样的。

client在发送登陆包后,然后进入等待接收状态。直到一个超时值耗完后。比如说。10s.
服务器在client超时后,读到登陆数据包,处理, 然后,又读到对端close( 不一定是串行的,也有可能服务器在处理登陆包时,服务器读到对端关闭sock的事件)

现在的疑惑是:为什么这些client发出的包,服务器会在超时后,epoll才返回事件,如果说之前有数据包没有处理。那么,之后的该fd,应该不会处于就绪状态,也不会有事件返回才对。

论坛徽章:
0
13 [报告]
发表于 2008-04-28 10:29 |只看该作者

回复 #10 net_robber 的帖子

怎么说?

这个有无接收确认应该不会是导致该问题出现的根本原因吧。

论坛徽章:
0
14 [报告]
发表于 2008-04-28 11:00 |只看该作者
我大概猜猜,你用的epoll中的ET模式,而且服务器去读取数据的时候没有读到EAGAIN,也就是没有读到返回错误为止,而是只读了一部分数据,这样里面残存的数据就不会给server发通知,直到client超时关闭了导致连接状态发生变化server才收到通知.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
15 [报告]
发表于 2008-04-28 11:03 |只看该作者
出现问题不要猜,要查。
学会使用各种系统工具去侦测/感知系统状态。
比如 netstat tcpdump snmp 等等。
搞明白是发送端的问题,还是接收端的问题。

论坛徽章:
0
16 [报告]
发表于 2008-04-28 11:26 |只看该作者

回复 #14 converse 的帖子

对的, 我之前也是这样怀疑的。 但是有两点让我排除这种可能性。

1: 因为通讯协议是固定长度的封包,而且,检测该sock,重连后,client只发了一个登陆包。 不会在发登陆包之前有数据到达的。
2: 即使有数据没有处理完。那么之后的epoll 也不会在sock的状态改变才返回啊。 因为ET模式,要不就不返回事件,要不立马返回。

回flw,谢谢你的忠告,我也一直认为臆想是程序员最大的毛病,只有测试-》分析问题-》得出结论才是正确的解决问题之道

论坛徽章:
0
17 [报告]
发表于 2008-04-28 12:01 |只看该作者
2: 即使有数据没有处理完。那么之后的epoll 也不会在sock的状态改变才返回啊。 因为ET模式,要不就不返回事件,要不立马返回。

你错了,ET模式要一直读到出错才行,否则如果缓冲区还有数据也不会通知的.我现在几乎可以肯定是这个原因了.

论坛徽章:
0
18 [报告]
发表于 2008-04-28 22:02 |只看该作者

回复 #17 converse 的帖子

你说的是正确的, 我之前一直把sock可读 和 接收到对端关闭sock,发送FIN,当作同一种状态,才钻入了死胡同。

论坛徽章:
0
19 [报告]
发表于 2008-04-29 20:09 |只看该作者
LZ,我针对使用EPOLL时需要注意的一些问题写了一份文档,你可以看看:

http://bbs.chinaunix.net/thread-1089208-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP