添加一个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函数更加直观、简洁。