尝试新思路——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
- 尝试新思路——Select模型的另一种实现
- 尝试新思路——CError的另一种实现方式
- 尝试新思路——跨平台Select模型
- 尝试新思路——CError、CExit和CNetworkEvent的一种实现
- 尝试新思路——CError和CExit
- 尝试新思路——网络事件类CNetworkEvent
- List的的另一种实现方法的尝试
- 对反射的思考——另一种抽象,另一种实现
- select模型的实现
- while select 的另一种实现方式"Next Table"
- Select模型的简单实现
- 服务器Select模型的实现
- 随笔——新思路
- 一行 Python 实现并行化 — 日常多线程操作的新思路
- 一行 Python 实现并行化 — 日常多线程操作的新思路
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型
- 朴素、Select、Poll和Epoll网络编程模型实现和分析——Select模型
- STM32F103按键操作的另一种实现——状态机
- MySQL数据库分表的3种方法
- 搭建maven nexus私服教程
- Eclipse创建Maven-Web项目及解决 jre版本和web.xml版本问题
- Quartz 并发/单线程
- 欢迎使用CSDN-markdown编辑器
- 尝试新思路——Select模型的另一种实现
- Android批量打包快速
- MTV台邀观众讲述爱情故事 众男星揭秘最美的她
- 启动MongoDB Service步骤
- java集合容器总结
- Markdown日常用法示例
- 什么是HTML5(三):性能&集成、设备访问
- [C语言][LeetCode][75]Sort Colors
- SpringMVC图片回显