尝试新思路——Select模型的另一种实现

添加一个CLogic类
头文件logic.h

#ifndef __LOGIC_H__
#define __LOGIC_H__

#include "MyError.h"
#include "MyExit.h"
#include "MySelectEvent.h"
#include "SocketImpl.h"
#include "Select.h"

class CLogic
{
public:
    CLogic();
    int Init();
    int CreateListenFd(const char* ip, short port);
    int Select();

    int HandleSystemError(int level);
    int HandleInvalidError(int level);
    int HandleInvalidExit(int level);
    int HandleInvalidEvent(int level);
    int HandleInvalidListenFd(int level);
    int HandleMaxFdError(int level);

private:
    LinWin::CSocketImpl* m_server;
    LinWin::CSelectImpl* m_select;
    CMyError* m_error;
    CMyExit* m_exit;
    CMySelectEvent* m_event;
};


#endif

实现文件logic.cpp

#include "Logic.h"
#include <iostream>
using namespace std;

CLogic::CLogic() : m_server(NULL), m_select(NULL), m_error(NULL), m_exit(NULL), m_event(NULL)
{

}

int CLogic::Init()
{
    do 
    {
        m_error = new CMyError();
        m_exit = new CMyExit();
        m_server = new LinWin::CSocketImpl();
        m_event = new CMySelectEvent();
        m_select = new LinWin::CSelectImpl();

        if (!m_error || !m_exit || !m_server || !m_event || !m_select)
            break;
        m_event->SetServer(m_server);
        m_event->SetExit(m_exit);
        m_select->SetError(m_error);

        m_error->m_errors.Add(0, this, &CLogic::HandleSystemError);
        m_error->m_errors.Add(ERROR_SELECT_MAXFD, this, &CLogic::HandleMaxFdError);
        m_error->m_errors.Add(ERROR_SELECT_EXIT, this, &CLogic::HandleInvalidExit);
        m_error->m_errors.Add(ERROR_SELECT_EVENT, this, &CLogic::HandleInvalidEvent);
        m_error->m_errors.Add(ERROR_SELECT_SOCKET, this, &CLogic::HandleInvalidListenFd);

        return 0;
    } while (0);

    return -1;
}

int CLogic::CreateListenFd(const char* ip, short port)
{
    LinWin::CSocketAddress addr(ip, port);
    do
    {
        if (m_server->Create() != 0)
        {
            cout << "Create socket error." << endl;
            break;
        }
        if (m_server->Bind(addr) != 0)
        {
            cout << "Bind address errror." << endl;
            break;
        }
        if (m_server->Listen(2) != 0)
        {
            cout << "Listen error." << endl;
            break;
        }
        return 0;
    } while (0);

    return -1;
}

int CLogic::Select()
{
    return m_select->Select();
}

int CLogic::HandleSystemError(int level)
{
    int err = LinWin::CSocketImpl::SocketError();
    cout << "Error code: " << err << ";  ";
    cout << "Error level: " << level << endl;

    return -1;
}

int CLogic::HandleInvalidError(int level)
{
    cout << "Error object is null.  ";
    cout << "Error level: " << level << endl;

    m_select->SetError(m_error);

    return 0;
}

int CLogic::HandleInvalidExit(int level)
{
    cout << "Exit object is null.  ";
    cout << "Error level: " << level << endl;

    m_select->SetExit(m_exit);

    return 0;
}

int CLogic::HandleInvalidEvent(int level)
{
    cout << "Network Event object is null.  ";
    cout << "Error level: " << level << endl;
    m_select->SetNetworkEvent(m_event);

    return 0;
}

int CLogic::HandleInvalidListenFd(int level)
{
    cout << "The listen fd object is null.  ";
    cout << "Error level: " << level << endl;
    m_select->SetListenFd(m_server->Sockfd());

    return 0;
}

int CLogic::HandleMaxFdError(int level)
{
    cout << "The clients is too much.  ";
    cout << "Error level: " << level << endl;

    return 0;
}

这个类负责整个程序的主要逻辑。首先初始化所有对象,并加载错误处理函数。然后实现Select主要功能。

主函数main.cpp文件

#include "Logic.h"
#include <iostream>
using namespace std;

#pragma comment(lib, "ws2_32.lib")

int main()
{
#ifdef WINDOWS_FAMILY
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif

    CLogic logic;
    logic.Init();
    if (logic.CreateListenFd(NET_DEFAULT_IP, 6666) == 0)
        logic.Select();

#ifdef WINDOWS_FAMILY
    WSACleanup();
#endif

    cin.get();

    return 0;
}

看一下main函数,就明白CLogic的作用,其实就是把主函数的逻辑封装到一个类中去了,从而使得main函数更加直观、简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值