|
在linux下开发了一个服务器我用reactor创建了ACE_Svc_Handler的派生类
目前运行良好,有一个问题很郁闷:
服务器有些时候需要强制关闭连接也就是派生的handler对象,根据ace的资料,建议通过reactor的线程关闭,我的做法如下:
(1)反注册我的处理类,并关闭socket
代码如下:
reactor()->remove_handler(this, ACE_Event_Handler::ALL_EVENTS_MASK|ACE_Event_Handler::DONT_CALL);
this->peer_.close();
(2)然后通过notify触发自身的handle_except
(3) 在稍后的handle_except里面进行默认的关闭,如delete this
但是某些情况下,我在delete this之后,reactor还会检测到对端的关闭,也就是reactor即将触发这个已经删除的对象的handle_input,我在tp_reactor的堆栈里面可以看到这一情况。
这时候就会出错。
现在没有办法只是在notify前面sleep一下来减少这种现象的发生。
我的意思是:reactor还没有调用到这个对象的相应handle_input,在框架里面就会出错,因为已经删除了对象。若是已调用到handle_input当然可以通过我自己的机制去保证。
不知道大家有没有碰到此类似问题。
我想大致的原因是这样的:
服务器这边主动关闭的同时,客户端也关闭了相应的连接。
当服务器还没有完全走完关闭流程的时候,却检测到了对端的关闭通知。 |
|