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_