C++实现服务器压力测试框架(一)

2015-07-20 17:11:33 ? 作者: ? 浏览: 11

C++实现服务器压力测试框架

flyfish 2015-3-9


模拟大量客户端对服务器进行压力测试框架

头文件
#pragma once
#include 
  
    
#include 
   
     #include 
    
      #include 
     
       #include 
      
        class CSession: public boost::enable_shared_from_this
       
         { public: CSession(const std::string IP, unsigned short port,int m_heartbeat_timer_minutes,boost::asio::io_service& io_service_); ~CSession(void); private: boost::asio::ip::tcp::endpoint m_ep; boost::asio::ip::tcp::socket m_sock; boost::asio::ip::tcp::resolver m_resolver; boost::array
        
          read_buffer; boost::array
         
           write_buffer; boost::asio::deadline_timer heartbeat_timer; int m_heartbeat_timer_minutes;//心跳间隔 以分为单位 void receive_handler(const boost::system::error_code &ec, std::size_t bytes_transferred);//接收数据处理结果 void connect_handler(const boost::system::error_code &ec); //连接处理结果 void heartbeat_handler(const boost::system::error_code &ec); //心跳处理结果 void login_handler(const boost::system::error_code &ec,std::size_t bytes_transferred);//登录结果的处理 void start_receive();//开始接收数据 void send_handler(const boost::system::error_code &ec); std::size_t check_frame(const boost::system::error_code &ec, std::size_t bytes_transferred);//校验数据 void parse_frame(const boost::system::error_code &ec, std::size_t bytes_transferred);//解析数据 public: void start_send();//其他地方调用时 只需要把任务加到任务队列 执行 io_service_.post(boost::bind(&CSession::start_send, this)); void start();//启动停止 void stop(); void login();//登录 void heartbeat();//心跳 task m_task_queue;//线程安全的任务队列 };
         
        
       
      
     
    
   
  

实现文件

#include "Session.h"

CSession::CSession(  
	const std::string IP,
	unsigned short port,
	int heartbeat_timer_minutes,
	boost::asio::io_service& io_service_)
	: m_resolver(io_service_),
	m_sock(io_service_),
	heartbeat_timer(io_service_),
	m_nConnectState(0),

	m_ep(boost::asio::ip::address::from_string(IP),port),
	m_pObj(nullptr),
	m_heartbeat_timer_minutes(heartbeat_timer_minutes),
	m_nHeartbeatCount(0)

	
{

	read_buffer.fill(0);

}
void CSession::start()
{

	m_sock.async_connect(m_ep,
		boost::bind(&CSession::connect_handler,
		shared_from_this(),
		boost::asio::placeholders::error));
}

CSession::~CSession(void)
{
	stop();
}
void CSession::stop()
{
	heartbeat_timer.cancel();
	m_sock.close();

}


std::size_t CSession::check_frame(const boost::system::error_code &ec, std::size_t bytes_transferred)
{
	//bytes_transferred 已经接收的字节数
	//返回0 表示 验证通过
	//返回1 表示 需要继续验证
	
}
void CSession::parse_frame(const boost::system::error_code &ec, std::size_t bytes_transferred)
{
	if (!ec) 
	{ 
	
	}	
}

void CSession::start_receive()
{
	m_sock.async_receive(boost::asio::buffer(read_buffer), 
		boost::bind(&CSession::receive_handler,
		shared_from_this(),
		boost::asio::placeholders::error,
		boost::asio::placeholders::bytes_transferred));
}
void CSession::receive_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) 
{ 
	if (!ec) 
	{ 

		//check_frame 验证接收的数据,当验证成功时,开始
		boost::asio::async_read(m_sock,boost::asio::buffer(read_buffer),
			boost::bind(&CSession::check_frame,
			shared_from_this(), boost::asio::placeholders::error,
			bytes_transferred),

			boost::bind(&CSession::parse_frame,
			shared_from_this(),
			boost::asio::placeholders::error,
			bytes_
            
-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: