ACE_Reactor中的handle_output

前端之家收集整理的这篇文章主要介绍了ACE_Reactor中的handle_output前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一直对ACE reactor framework中的handle_output困惑不解,而且个人觉得select是个很恶心的函数

直到前段时间工作上需要用到网络编程,又把C++网络编程卷2找出来看看,写了几个小程序做实验才渐渐明白了reactor中都handle_output的触发条件。回想以前抱着书看了很久就是懒得动手写代码,结果总是一知半解的,看来“实践出真知”一点都不假。

关于handle_output的小结:

当ACE_WFMO_Reactor回调到handle_output时你可以认为一直可写,直到写操作返回EWOULDBLOCK为止。如果socket一直都可以写,ACE_WFMO_Reactor只会调用一次handle_output。因为socket本身的状态没有发生改变,ACE_WFMO_Reactor不会将它放在待分派的事件源中。那么下一次调用handle_output会是什么时候呢?答案是socket从不可写状态变为可写。这就是所谓的“边缘触发方式”。

再来看看ACE_Select_Reactor。Select_Reactor基于BSD Socket的select系统函数,使用的是“水平触发方式”。也就是说,如果socket可写,ACE_Select_Reactor就会不停地调用handle_output,可以说它是比较勤快和公平的,呵呵。

下面是个简单的测试程序:echo服务器。你可以通过宏USE_SELECT_REACTOR来决定使用WFMO_Reactor还是Select_Reactor。