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