找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 7074|回复: 3

LINUX 系统使用ACE_Acceptor ACE_Reactor ACE_Svc_Handler问题

[复制链接]
发表于 2008-6-11 00:09:23 | 显示全部楼层 |阅读模式
class CClientService: public ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_MT_SYNCH>
{
virtual int open(void * = 0);
virtual int handle_input(ACE_HANDLE fd = ACE_INVALID_HANDLE);
virtual int handle_close(ACE_HANDLE handle, ACE_Reactor_Mask mask);
virtual int handle_output(ACE_HANDLE fd = ACE_INVALID_HANDLE);
virtual int handle_timeout (const ACE_Time_Value &time, const void *);
....
};
class CClientService2: public ACE_Svc_Handler<ACE_SOCK_STREAM,ACE_MT_SYNCH>
{
virtual int open(void * = 0);
virtual int handle_input(ACE_HANDLE fd = ACE_INVALID_HANDLE);
virtual int handle_close(ACE_HANDLE handle, ACE_Reactor_Mask mask);
virtual int handle_output(ACE_HANDLE fd = ACE_INVALID_HANDLE);
virtual int handle_timeout (const ACE_Time_Value &time, const void *);
....
};
class CAcceptorEvent: public ACE_Task_Base
{
public:
virtual int svc(void);
};
ACE_TP_Reactor Accept_tp_reactor1;
ACE_Reactor AcceptReactor1(&Accept_tp_reactor1,1);
int CAcceptorEvent::svc()
{
while ( 1 )
{
  AcceptReactor1.handle_events();
}
}
ACE_TP_Reactor Accept_tp_reactor2;
ACE_Reactor AcceptReactor2(&Accept_tp_reactor2,1);
class CAcceptorEvent2: public ACE_Task_Base
{
public:
virtual int svc(void);
};
int CAcceptorEvent2::svc()
{
while ( 1 )
{
  AcceptReactor1.handle_events();
}
}
#define LISTENPORT1 7000
#define LISTENPORT2 7001
CAcceptorEvent  gserveracceptevent1;
CAcceptorEvent2  gserveracceptevent2;

int _tmain(int argc, char* argv[])
{
ACE_Acceptor<CClientService,ACE_SOCK_ACCEPTOR> AcceptorClient1;
ACE_INET_Addr address(LISTENPORT1);
if(AcceptorClient1.open(address,&AcceptReactor1,1) == -1)
{
  cout <<"Build Listen Port For Client1 Fail!\n";
  return -1;
}

ACE_Acceptor<CClientService2,ACE_SOCK_ACCEPTOR> AcceptorClient2;
ACE_INET_Addr address2(LISTENPORT2);
if(AcceptorClient2.open(address2,&AcceptReactor2,1) == -1)
{
  cout <<"Build Listen Port For Client2 Fail!\n";
  return -1;
}

gserveracceptevent1.activate();
gserveracceptevent2.activate();
ACE_Thread_Manager::instance()->wait();
return 0;

/*
为什么我使用以上这个框架写了一个服务器程序,提供两种服务,分别绑定了7000和7001两个端口。该服务器程序运行在LINUX系统上。
当做压力测试的时候,只对其中一个服务(如:7000)做压力测试,另一个端口只绑定并不进行通信。出现了这样的情况:如果请求连接的客户端超过了100个,
这个时候服务器程序没有快速处理完这些请求的话,持续一段时间后,大部分连接都正常结束了,
只有某一个请求还一直保持连接状态。要是有新的连接请求到了,服务器程序就不做处理了。在CClientService类中也实现了handle_timeout.如果超时,就直接在handle_timeout函数里调用了
this->peer().close();尝试关闭连接.可是,这样的情况下,根本不会调用超时的函数..?!
也就不能再接收新的请求了。用netstat -an 查看,发现有的新连接成功通过TCP握手处于ESTABLISHED状态,而有一些处于SYN_RECV状态。而处于ESTABLISHED状态的
连接,ACE_Acceptor并没有创建出新的CClientService。服务器就这样傻眼了。。。。,然而,7001这个端口这个时候是能正常与客户端程序通信的...........??????????????
如果哪个朋友知道这个原因,恳请指点下,本人不是很熟ACE,谢谢!
*/

[ 本帖最后由 lsxsoftr 于 2008-6-11 00:18 编辑 ]
发表于 2008-6-11 13:26:52 | 显示全部楼层
感觉是ACCEPTOR的使用不对头,你参考一下卷2的用法看看呢。
 楼主| 发表于 2008-6-11 18:53:23 | 显示全部楼层

问题解决了

--谢谢winston的指点.不过,我没有去看您说的那本书,我直接看ACE的源代码.然后,把我的问题搞定了........还是源代码比书本更有说服力...哈哈
那个ACE_Acceptor这样用应该没问题的吧?
发表于 2008-7-8 13:52:43 | 显示全部楼层
问题是怎么解决的?可以把解决方法贴出来吗?这样可以让大家有个参考。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-11-22 01:12 , Processed in 0.038071 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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