peakzhang 发表于 2008-1-7 20:55:16

关于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个为什么不正常.我的错误码可能在哪些地方???

peakzhang 发表于 2008-1-7 20:55:24

你用TP_Reactor应该不会有问题!!

如果用Select_Reactor就在你的事件循环前加入 ACE_Reactor::instance()->owner(ACE_OS::thr_self ());

peakzhang 发表于 2008-1-7 20:55:38

为什么我在线程中putq总返回10035错误呢,说是无法立即完成一个非阻挡性套接字操作,Resource temporarily unavailable]
页: [1]
查看完整版本: 关于ace_reactor的问题和一些想法.