实现一个可限制最大连接数的Proactor服务器

在服务器程序实现中,一般要求能够限制服务器的最大连接数,这主要是从服务器的性能方面考虑,当过多的连接到来时,服务器虽然能够处理,但效率非常低下,也就会出现卡机的现象。

 

在用Proactor框架实现的服务器中可以很容易地做到这一点。ACE_Asynch_Acceptor类有一个虚方法:make_handler(),默认情况下是new一个服务处理对象出来,我们可以让他在适当的时候返回一个空值,这样,新的连接便被拒绝了。

 

另外为了避免每次都完全构造一个全新的服务处理对象,这里还可以使用预分配的方法,一开始便创建出所有的service对象,当有连接到来时,直接取一个未使用的分配给该连接,当连接关闭时,同时也不delete该对象,而是加到空闲队列中,等下一次有新连接到来时再使用。

 

实现的代码如下:

#include <ace/Os_main.h>
#include <ace/Asynch_Acceptor.h>
#include <ace/Proactor.h>
#include <list>
 
#define LISTEN_PORT 5222              // 服务器监听端口
#define MAX_CONNS 2                     // 最大连接数
 
class HA_Proactive_Acceptor;
 
class HA_Proactive_Service : public ACE_Service_Handler
{
public:
       virtual ~HA_Proactive_Service ();
 
       void init( HA_Proactive_Acceptor * acceptor );
 
       virtual void open (ACE_HANDLE h, ACE_Message_Block&);
       virtual void handle_read_stream (const ACE_Asynch_Read_Stream::Result &result);
       virtual void handle_write_stream (const ACE_Asynch_Write_Stream::Result &result);
 
private:
       ACE_Asynch_Read_Stream reader_;
       ACE_Asynch_Write_Stream writer_;
 
       HA_Proactive_Acceptor * acceptor_;
};
 
 
class HA_Proactive_Acceptor : public ACE_Asynch_Acceptor<HA_Proactive_Service>
{
public:
       HA_Proactive_Acceptor();
 
       void free_handler( HA_Proactive_Service * service );
 
private:
       virtual HA_Proactive_Service *make_handler (void);
       void init_handlers();
 
private:
       typedef std::list<HA_Proactive_Service *> T_Handler_List;
       T_Handler_List handler_list_;
};
 
 
HA_Proactive_Service::~HA_Proactive_Service ()
{
       if (this->handle () != ACE_INVALID_HANDLE)
              ACE_OS::closesocket (this->handle ());
}
 
void HA_Proactive_Service::init( HA_Proactive_Acceptor * acceptor )
{
       this->acceptor_ = acceptor;
}
 
void HA_Proactive_Service::open (ACE_HANDLE h, ACE_Message_Block&)
{
       this->handle (h);
       if (this->reader_.open (*this) != 0 || this->writer_.open (*this) != 0   )
       {
              ACE_OS::closesocket (this->handle ());
              this->acceptor_->free_handler( this );
              return;
       }
 
       ACE_Message_Block *mb;
       ACE_NEW_NORETURN (mb, ACE_Message_Block (1024));
       if (this->reader_.read (*mb, mb->space ()) != 0)
       {
              mb->release ();
              ACE_OS::closesocket (this->handle ());
              this->acceptor_->free_handler( this );
       }
}
 
void HA_Proactive_Service::handle_read_stream (const ACE_Asynch_Read_Stream::Result &result)
{
       ACE_Message_Block &mb = result.message_block ();
       if (!result.success () || result.bytes_transferred () == 0)
       {
              mb.release ();
              ACE_OS::closesocket (this->handle ());
              this->acceptor_->free_handler( this );
       }
       else
       {
              ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Received Data : %c/n"), *mb.rd_ptr()));
              mb.release();
 
              ACE_Message_Block *new_mb;
              ACE_NEW_NORETURN (new_mb, ACE_Message_Block (1024));
              this->reader_.read (*new_mb, new_mb->space ());
       }
}
 
void HA_Proactive_Service::handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)
{
       result.message_block ().release ();
}
 
 
HA_Proactive_Acceptor::HA_Proactive_Acceptor() : ACE_Asynch_Acceptor<HA_Proactive_Service>()
{
       init_handlers();
}
 
void HA_Proactive_Acceptor::free_handler( HA_Proactive_Service * service )
{
       this->handler_list_.push_back( service );
}
 
HA_Proactive_Service * HA_Proactive_Acceptor::make_handler (void)
{
       if( this->handler_list_.empty() )
              return 0;
 
       HA_Proactive_Service * service = this->handler_list_.front();
       this->handler_list_.pop_front();
 
       return service;
}
 
void HA_Proactive_Acceptor::init_handlers()
{
       for( int i = 0; i < MAX_CONNS; ++i )
       {
              HA_Proactive_Service * service;
              ACE_NEW( service, HA_Proactive_Service );
              service->init( this );
              this->handler_list_.push_back( service );
       }
}
 
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
       ACE_INET_Addr listen_addr( LISTEN_PORT );
       HA_Proactive_Acceptor aio_acceptor;
       if (0 != aio_acceptor.open (listen_addr, 0, 0, 5, 1, 0, 0))
              ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p/n"), ACE_TEXT ("acceptor open")), 1);
 
       ACE_Proactor::instance ()->proactor_run_event_loop ();
 
       return 0;
}

转帖:http://blog.csdn.net/lfhfut/article/details/943532

《企业级 VMware vSphere 6.7虚拟化技术配置与管理》课程共分为“上集”和“下集”两部分,本套视频为“下集”部分,“上集”部分已经对VMware vSphere 6.7的计算资源、网络资源、存储资源、虚拟机配置与管理等进行了详细讲解,“下集”部分以“上集”为基础进行技术延伸,全面对vMotion、DRS、HA、FT、性能监控、VDP备份等特性进行理论讲解和实战配置。 通过本课程学习,可以全面掌握vMotion、资源池、DRS、HA、FT、VDP、监控等高可用性运维技能。 《企业级 VMware vSphere虚拟化技术配置与管理》下集部分具体课程章节如下。 第1章 《VMware vSphere 6.7 vMotion配置与管理》主要内容本章我们详细介绍了冷迁移、通过 vMotion 迁移、通过 Storage vMotion 迁移、CPU 兼容性和 EVC、在 vSphere Client中迁移已关闭电源或已挂起的虚拟机、将开机状态的虚拟机迁移至新计算资源和存储、关于迁移兼容性检查等内容。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第2章 《VMware vSphere 6.7 资源和DRS配置与管理》主要内容本章我们主要讲解了CPU虚拟化资源管理知识、内存虚拟化资源管理知识、存储虚拟化资源管理知识、资源池、DRS群集、Storage I/O Control、科学合理的进行资源分配相关理论和操作。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第3章 《VMware vSphere 6.7 HA配置与管理》主要内容本章我们主要讲解了业务连续性和最小化停机时间、vSphere HA 的工作原理、vSphere HA 准入控制、vSphere HA 互操作性等知识。通过实践操作,可以掌握创建 vSphere HA 群集,配置 vSphere HA群集,配置 Proactive HA。为了提高vCenter Server的高可用性,讲解了vCenter High Availability知识。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第4章 《VMware vSphere 6.7 FT配置与管理》主要内容本章我们从理论上讲解了Fault Tolerance 的工作原理、Fault Tolerance工作用例、Fault Tolerance 环境要求、限制和许可、Fault Tolerance 互操作性。以理论为基础,实践了打开Fault Tolerance功能、测试Fault Tolerance故障切换、迁移辅助虚拟机、挂起Fault Tolerance、恢复Fault Tolerance、关闭Fault Tolerance等内容。最后总结了使用Fault Tolerance的科学做法、Fault Tolerance的故障排除方法。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第5章 《VMware vSphere Data Protection(VDP)》 主要内容本章我们从理论上讲解vSphere Data Protection的基本功能、体系架构。演示了VDP的安装和配置,讲解了怎样正确使用VDP以及使用VDP进行管理备份,自动备份验证,管理恢复,复制作业,文件级恢复,紧急恢复,VDP代理等相关功能,最后针对VDP常见故障进行了总结分析。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 第6章 《VMware vSphere 6.7 监控和性能》 主要内容本章我们从理论上讲解了vSphere监控、性能、日志等相关基本知识。实践操作了使用性能图表监控清单对象、监控事件和警报、系统日志文件的配置。希望大家在掌握理论的基础上,跟做课程中涉及的每一个实验,达到融会贯通的效果。 企业级 VMware vSphere 6.7虚拟化技术配置与管理(上集)视频课程:https://edu.csdn.net/course/detail/35162企业级 VMware vSphere 6.7虚拟化技术配置与管理(下集)视频课程:https://edu.csdn.net/course/detail/35171
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值