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

来源:互联网 发布:2016年9月m2数据 编辑:程序博客网 时间:2024/06/05 06:02

添加一个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
原创粉丝点击