找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3693|回复: 2

关于ace_reactor的问题和一些想法.

[复制链接]
发表于 2008-1-7 20:55:16 | 显示全部楼层 |阅读模式
模仿的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个为什么不正常.我的错误码可能在哪些地方???
 楼主| 发表于 2008-1-7 20:55:24 | 显示全部楼层
你用TP_Reactor应该不会有问题!!

如果用Select_Reactor就在你的事件循环前加入 ACE_Reactor::instance()->owner(ACE_OS::thr_self ());
 楼主| 发表于 2008-1-7 20:55:38 | 显示全部楼层
为什么我在线程中putq总返回10035错误呢,说是无法立即完成一个非阻挡性套接字操作,Resource temporarily unavailable]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 07:16 , Processed in 0.019676 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表