lsxsoftr 发表于 2008-6-11 00:09:23

LINUX 系统使用ACE_Acceptor ACE_Reactor ACE_Svc_Handler问题

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
CAcceptorEventgserveracceptevent1;
CAcceptorEvent2gserveracceptevent2;

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 编辑 ]

winston 发表于 2008-6-11 13:26:52

感觉是ACCEPTOR的使用不对头,你参考一下卷2的用法看看呢。

lsxsoftr 发表于 2008-6-11 18:53:23

问题解决了

--谢谢winston的指点.不过,我没有去看您说的那本书,我直接看ACE的源代码.然后,把我的问题搞定了........还是源代码比书本更有说服力...哈哈
那个ACE_Acceptor这样用应该没问题的吧?

dm119 发表于 2008-7-8 13:52:43

问题是怎么解决的?可以把解决方法贴出来吗?这样可以让大家有个参考。
页: [1]
查看完整版本: LINUX 系统使用ACE_Acceptor ACE_Reactor ACE_Svc_Handler问题