|
楼主 |
发表于 2009-5-31 00:26:04
|
显示全部楼层
我的代码实现大致上是这样的:
int Connect::InitConnect() //这是我初始化线程的方法
{
ACE_Select_Reactor pSelectReactor;
ACE_NEW_RETURN (pSelectReactor, ACE_Select_Reactor, -1);
ACE_Reactor pReactor;
ACE_NEW_RETURN (pReactor, ACE_Reactor(ACE_Select_Reactor, 1), -1);
ACE_Reactor::instance(pReactor, 1);
if (StartThead(pReactor)) //这里是调动一个线程来实现连接设备的,
//这里面是使用CClient的指针来实现连接的。
{
return -1;
}
return 0;
}
int CClient::open(void *p)
{
if (acceptor_.open (local_addr) == -1) return -1;
return reactor ()->register_handler(this, ACE_Event_Handler::ACCEPT_MASK);
}
int CClient::handle_input(ACE_HANDLE)
{
if (收到数据)
{
Split(strData); //该方法是用来将收到的消息进行分割并通知上层的。
}
return 0;
}
int CClient::handle_timeout(ACE_HANDLE)
{
//设定时器,如果到达定时器时间handle_input还没有收到相应的数据则超时
this->peer()->handle_close(); //这里是可以调用的,
//理论上调用完这个方法应该调用CClient::handle_close()
return 0;
}
int CClient::handle_close (ACE_HANDLE, ACE_Reactor_Mask)
{
SVC_Handle::handle_close();//这里好像是要调用父类的handle_close(),进行释放。
return 0;
}
基本上我使用的ACE_Select_Reactor就是这样的。原来是直接使用ACE_Reactor的没有出现过数据接收超时的情况,在windows平台下ACE_Reactor的默认实现类是ACE_WMFO_Reactor,我将其替换为ACE_Select_Reactor,来避免受最大62事件处理的限制,就出现的接收数据超时的情况。 |
|