• 大小: 14KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-03
  • 语言: C/C++
  • 标签: c++  负载均衡  

资源简介

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.xml
     文件        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

评论

共有 条评论