资源简介
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
相关资源
- 中国地质大学C++课件6
- 条码CODE128C语言算法
- 图书信息管理系统设计源代码C++
- fmod 音频库 c++ Qt编写
- 基于c++的RSA加密解密程序及源码
- 鼠标脚本精灵.rar
- 实现简单银行叫号模拟系统(C++版)
- C++万能头文件 stdc++.h
- 数据结构课设排序算法的可视化演示
- c++所有头文件
- C++ primer plus 第六版 全部编程练习答案
- C++面试题常见问题
- C++ 用户管理模块
- C++实现HTTP处理类
- C++2017.txt
- C.C++笔试面试必备宝典我就靠它进的公
- 02_C++PrimerPlus_中文版_第6版_超清.txt
- C++自绘柱状图.rar
- 自己写的元胞自动机NS模型
- 2048C++版本带图形界面
- CGridListCtrlEx源码vc++
- 使用C++的二叉搜索树实现学生成绩管
- 狼吃羊C++代码
- 语音识别系统源码
- libstdc++-3.4.6-9.i386_libstdc++-3.4.6-11.x86_
- C++ Builder DLL
- windows下c实现telnet代码
- 梯度下降求函数极值C++代码
- VC++ 串口调试助手源代码
- 基于QtQuick的QCustomPlot实现
评论
共有 条评论