关于ace_reactor的问题和一些想法.
模仿的FTP协议,一个acceptor框架建立了连接服务与客户进行命令通信,连接服务新创建了acceptor框架用于与客户进行这次通信的数据传输.当连接服务在有读的事件时响应handle_input,实现如下,
1,确定命令接收完整; 2,解析命令; 3,创建线程,在线程中创建新的acceptor框架用于客户数据连接; 4,将客户用于数据连接的相关信息打包ACE_Message_Block,putq到消息队列. 5,注册反应器的写事件用于发送打包的消息.
在上述3 中的线程函数实现如下:{
CClientAcceptor* m_DataAcceptorPtr = 0;
ACE_Select_Reactor select_reactor;
ACE_Reactor reactor(&select_reactor, 0);
ACE_NEW_RETURN(m_DataAcceptorPtr, CClientAcceptor(), -1);
m_DataAcceptorPtr->m_Flag = ptr->m_Flag+1; //大家忽略
m_DataAcceptorPtr->m_TaskIndex = ptr->m_TaskIndex; //大家忽略
ACE_INET_Addr listen(g_TaskManager.GetDataPort(ptr->m_TaskIndex), ACE_LOCALHOST);
m_DataAcceptorPtr->reactor(&reactor); //选择反应器为ACE_Select_Reactor
if(m_DataAcceptorPtr->Open(listen) == -1){ //调用缺省的open,并注册反应器为ACCEPT_MASK
return -1;
}
m_AccPtr = m_DataAcceptorPtr; //大家忽略
m_DataAcceptorPtr->Run(); //运行事件循环
}
但是在连接服务的handle_output没有响应4中put进行的消息.不知道为何???????
如果将上面红色字体那行改为m_DataAcceptorPtr->reactor(this->reactor());后连接服务可以响应handle_output.也就是说新建的反应器为连接服务用了同一个反应器后可正常.或者说两个acceptor用了同一个反应器后正常,用2个为什么不正常.我的错误码可能在哪些地方??? 你用TP_Reactor应该不会有问题!!
如果用Select_Reactor就在你的事件循环前加入 ACE_Reactor::instance()->owner(ACE_OS::thr_self ()); 为什么我在线程中putq总返回10035错误呢,说是无法立即完成一个非阻挡性套接字操作,Resource temporarily unavailable]
页:
[1]