网上reactor模式的解析文章很多,但是都很范范,看了以后感觉理解的还是很模糊。
图片待传
今天遇到一个问题:
Initiation Dispatcher根据handle选择Event handler的,为什么调用select (handlers);?
首先handle不等于type,handle是fd(socket打开的描述符)
Initiation Dispatcher根据type选择Event handler,然后调用get_handle()得到操作系统需要的fd,根据fd得到
是哪一个socket客户端发送的请求。handle_event进行事件处理。
1、注册事件ACE_Reactor::register_handler()上注册一个事件,注册的事件类型相当于收货地址(Reactor会根据
注册的事件类型调用对应的挂钩方法),register_handler的第一个参数是ACE_Event_Handler指针,第二个参数是
注册的事件类型。
ACE_Reactor::instance()->register_handler(this,ACE_Event_Handler::READ_MASK);
2、仅有收货地址是不够的,还需要指定收货人。由于ACE_Event_Handler是虚基类,我们需要在子类中提供收货人实
体。假设需要接收的物品为数据流,可以定义实体ACE_SOCK_Stream m_Peer。将ACE_SOCK_Stream收货人信息通知
给某宝的方法是get_handle,使用方法如下:
ACE_HANDLE CClass::get_handle (void) const
{
return m_Peer.get_handle ();
};
3、收到了货物,试用了后觉得还不错,给予反馈,客户端继续送;或者通知客户端不要再送该类物品。
参考:
ace_event_handler
http://www.cnblogs.com/hgwang/p/5874675.html
http://blog.csdn.net/win2ks/article/details/2613021
http://blog.csdn.net/xiajun07061225/article/details/9250579
文件描述符与打开文件的关系
http://blog.csdn.net/cywosp/article/details/38965239