找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3386|回复: 4

求助:Linux上reactor的问题

[复制链接]
发表于 2009-11-9 21:08:07 | 显示全部楼层 |阅读模式
问题:
handle_timeout()中发送数据,如果发送过快,会出错。。。
修改SO_SNDLOWAT好像也没效果,比如改为4k,handle_timeout()每次发4k,发一阵子就会出错。errno 11,错误信息:resource temporarily unavailable。按道理触发write mask的时候可以无阻塞写SO_SNDLOWAT大小的数据的,一次发送过多如果超过SO_SNDLOWAT也只会是部分成功,而不应该是失败。
现在只能在handle_timeout()中每次发送前sleep 10毫秒,可以发大文件了。
用默认的select或者换dev_poll_reactor都一样,同样的代码在windows下一点问题没有。
如果不用ACE,直接用cselect代码发文件,没问题。

Reactor的代码看起来好累。。。
发表于 2009-11-10 12:45:59 | 显示全部楼层
按道理是触发write mask的时候可以无阻塞写,
wishel是否保证的handle_timeout触发的时候,write mask一定触发了呢?

另外,handle_timeout的设置的触发时间间隔+10ms就可以了。
 楼主| 发表于 2009-11-10 14:40:23 | 显示全部楼层
吐了n升血之后终于找到原因了,我把socket模式改成了nonblock,这样在linux下select会当成永远ready,就是说永远可以直接io而不会block。在windows下wfmo可能不会这么处理。

也就是说,linux下,select或epoll lt是不能用于nonblock fd的。
 楼主| 发表于 2009-11-11 15:56:03 | 显示全部楼层
见鬼。。。重新编译了ACE,这个现象消失了。
3楼结论作废。。。
 楼主| 发表于 2009-11-12 20:16:24 | 显示全部楼层
果然世界上是没有鬼的,找到原因了,我在
handle_out()
中这么写的:

char buffer[8192];
return peer().send(buffer, 8192);

只能说ACE的设计有些地方有点忽视用户的惯常思维。这就是所谓的OVERDESIGN吧,添加了基本无用的功能,却让人更容易出错了。设计的一个重要原则就是应该要贴近用户的惯常思维。
好吧,我承认我是在发牢骚,人家文档上写明白了,怪我没自己看文档。可我就是不满意。。。

[ 本帖最后由 wishel 于 2009-11-12 20:18 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 18:33 , Processed in 0.012747 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表