资源简介
c++负载均衡源码。该程序能从所有逻辑服务器中选取负荷最小的一台来处理新到的客户端。使用了有限状态机、进程池、有限状态机、统一信号源以及高效数据结构来提高其性能。有助于将所学的东西融会贯通起来。

代码片段和文件信息
#include
#include
#include
#include “conn.h“
#include “log.h“
#include “fdwrapper.h“
conn::conn()
{
m_srvfd = -1;
m_clt_buf = new char[ BUF_SIZE ]; //客户端缓冲区
if( !m_clt_buf )
{
throw std::exception();
}
m_srv_buf = new char[ BUF_SIZE ];
if( !m_srv_buf )
{
throw std::exception();
}
reset();
}
conn::~conn()
{
delete [] m_clt_buf;
delete [] m_srv_buf;
}
void conn::init_clt( int sockfd const sockaddr_in& client_addr ) //客户端socket 地址
{
m_cltfd = sockfd;
m_clt_address = client_addr;
}
void conn::init_srv( int sockfd const sockaddr_in& server_addr ) //服务器端socket地址
{
m_srvfd = sockfd;
m_srv_address = server_addr;
}
void conn::reset()
{
m_clt_read_idx = 0;
m_clt_write_idx = 0;
m_srv_read_idx = 0;
m_srv_write_idx = 0;
m_srv_closed = false;
m_cltfd = -1;
memset( m_clt_buf ‘\0‘ BUF_SIZE );
memset( m_srv_buf ‘\0‘ BUF_SIZE );
}
RET_CODE conn::read_clt()
{
int bytes_read = 0;
while( true )
{
if( m_clt_read_idx >= BUF_SIZE )
{
log( LOG_ERR __FILE__ __LINE__ “%s“ “the client read buffer is full let server write“ );
return BUFFER_FULL;
}
bytes_read = recv( m_cltfd m_clt_buf + m_clt_read_idx BUF_SIZE - m_clt_read_idx 0 ); //???
if ( bytes_read == -1 )
{
if( errno == EAGAIN || errno == EWOULDBLOCK ) // 非阻塞情况下: EAGAIN表示没有数据可读,请尝试再次调用而在阻塞情况下,如果被中断,则返回EINTR; EWOULDBLOCK等同于EAGAIN
{
break;
}
return IOERR;
}
else if ( bytes_read == 0 ) //连接被关闭
{
return CLOSED;
}
m_clt_read_idx += bytes_read;
}
return ( ( m_clt_read_idx - m_clt_write_idx ) > 0 ) ? OK : NOTHING;
}
RET_CODE conn::read_srv()
{
int bytes_read = 0;
while( true )
{
if( m_srv_read_idx >= BUF_SIZE )
{
log( LOG_ERR __FILE__ __LINE__ “%s“ “the server read buffer is full let client write“ );
return BUFFER_FULL;
}
bytes_read = recv( m_srvfd m_srv_buf + m_srv_read_idx BUF_SIZE - m_srv_read_idx 0 );
if ( bytes_read == -1 )
{
if( errno == EAGAIN || errno == EWOULDBLOCK )
{
break;
}
return IOERR;
}
else if ( bytes_read == 0 )
{
log( LOG_ERR __FILE__ __LINE__ “%s“ “the server should not close the persist connection“ );
return CLOSED;
}
m_srv_read_idx += bytes_read;
}
return ( ( m_srv_read_idx - m_srv_write_idx ) > 0 ) ? OK : NOTHING;
}
RET_CODE conn::write_srv()
{
int bytes_write = 0;
while( true )
{
if( m_clt_read_idx <= m_clt_write_idx )
{
m_clt_read_idx = 0;
m_clt_write_idx = 0;
return BUFFER_EMPTY;
}
bytes_write = s
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2018-08-02 03:39 springsnail\
文件 284 2016-06-04 11:57 springsnail\config.xm
文件 4576 2018-07-27 13:43 springsnail\conn.cpp
文件 795 2018-07-27 09:45 springsnail\conn.h
文件 1091 2013-02-26 06:56 springsnail\fdwrapper.cpp
文件 433 2013-02-26 08:11 springsnail\fdwrapper.h
文件 1543 2016-06-04 11:57 springsnail\log.cpp
文件 233 2016-06-04 11:57 springsnail\log.h
文件 7876 2018-07-31 00:47 springsnail\main.cpp
文件 437 2013-02-26 06:54 springsnail\Makefile
文件 9021 2018-07-31 00:54 springsnail\mgr.cpp
文件 969 2018-08-01 11:52 springsnail\mgr.h
文件 16090 2018-08-02 03:13 springsnail\processpool.h
- 上一篇:条码CODE128C语言算法
- 下一篇:中国地质大学C++课件6
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
评论
共有 条评论