在外网上运行平台,通信模块经常会出现网络错误110,一直触发accept事件,accept时阻塞5秒,影响数据的收发。
通过打日志发现, CTCPSessionMgr2::handle_input(ACE_HANDLE fd)过来的fd,已经不是注册时的fd了
CTCPSessionMgr2::Connect时会向
m_pReactor->register_handler(m_listener.get_handle(), this, ACE_Event_Handler::ACCEPT_MASK);
查找原因:
是因为开始启动时,commonserver会Connect监听一个端口,调用了注册accept事件,然后集控模块监听客户端时,没有生成新的管理对象,也调用了Connect监听另一个端口,注册了accept事件。
当有客户端连接第一个端口,会触发这个对象的accept事件,然后在后一个端口进行accept,当然会超时失败。返回0,因为第一个端口的事件没有处理完,一直会触发。
修改:
1、监听时new一个对象,使用不同的对象进行accept
2、accept时如果fd不是自己返回-1,不再处理这个非法fd的事件