wishel 发表于 2009-11-9 21:08:07

求助:Linux上reactor的问题

问题: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,直接用c写select代码发文件,没问题。
Reactor的代码看起来好累。。。

modern 发表于 2009-11-10 12:45:59

按道理是触发write mask的时候可以无阻塞写,
wishel是否保证的handle_timeout触发的时候,write mask一定触发了呢?

另外,handle_timeout的设置的触发时间间隔+10ms就可以了。

wishel 发表于 2009-11-10 14:40:23

吐了n升血之后终于找到原因了,我把socket模式改成了nonblock,这样在linux下select会当成永远ready,就是说永远可以直接io而不会block。在windows下wfmo可能不会这么处理。

也就是说,linux下,select或epoll lt是不能用于nonblock fd的。

wishel 发表于 2009-11-11 15:56:03

见鬼。。。重新编译了ACE,这个现象消失了。
3楼结论作废。。。

wishel 发表于 2009-11-12 20:16:24

果然世界上是没有鬼的,找到原因了,我在
handle_out()中这么写的:

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

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

[ 本帖最后由 wishel 于 2009-11-12 20:18 编辑 ]
页: [1]
查看完整版本: 求助:Linux上reactor的问题