iocp 完成端口封装类 内存优化 高并发 接口简单
来源:互联网 发布:朴素贝叶斯算法例子 编辑:程序博客网 时间:2024/06/16 02:03
文章转自王牌软件----
class Iocp //完成端口 功能类
class IocpMemoryManager //此类提供IOCP 内存的管理
//Iocp.h#pragma once #include "IocpMemoryManager.h"#include <windows.h> #define MAXWORKERTHREADS 2 //iocp类封装classCIocp{public: CIocp(void); ~CIocp(void); boolStartServer(intnPort = 4568, intnMaxConnections = 2000);//开始服务 监听端口,最大的连接数 boolReStartServer(); //重启服务 boolStopServer(); //停止服务 intGetCurrentConnection(); //得到当前的连接数 boolSendText(CIOCPContext *pContext, char*pszText, intnLen);//发送数据给客户端 char* GetCustomLastError(); //获取最后的错误信息 protected: // 事件通知函数 virtualvoid OnConnectionEstablished(CIOCPContext *pContext, CIOCPBuffer *pBuffer) = 0; // 建立了一个新的连接 virtualvoid OnConnectionClosing(CIOCPContext *pContext, CIOCPBuffer *pBuffer) = 0; // 一个连接关闭 virtualvoid OnConnectionError(CIOCPContext *pContext, CIOCPBuffer *pBuffer, intnError) = 0;// 在一个连接上发生了错误 virtualvoid OnReadCompleted(CIOCPContext *pContext, CIOCPBuffer *pBuffer) = 0; // 一个连接上的读操作完成 virtualvoid OnWriteCompleted(CIOCPContext *pContext, CIOCPBuffer *pBuffer) = 0; // 一个连接上的写操作完成 private: IocpMemoryManager* m_pIocpMemoryManager;//此类提供IOCP 内存的管理 boolm_bServerStarted; //服务是否已经启动 intm_nPort; // 服务器监听的端口 intm_nInitialAccepts; //初始化投递的接受请求数 intm_nInitialReads; //初始化投递Accept数 intm_nMaxAccepts; //最大接受数 intm_nMaxSends; //单套接字最大发送数 intm_nMaxListenCount; //最大的监听数 intm_nMaxWorkerThreads; //最大工作线程数 char* m_pcaErrorMessage; //错误信息 取得最后一个错误信息 //Event HANDLEm_hAcceptEvent; // 用于投递Accept请求 HANDLEm_hRepostEvent; LONGm_nRepostCount; //套接字信息 HANDLEm_hListenThread; // 监听线程 HANDLEm_hCompletion; // 完成端口句柄 SOCKET m_sListen; // 监听套节字句柄 LPFN_ACCEPTEX m_lpfnAcceptEx; // AcceptEx函数地址 LPFN_GETACCEPTEXSOCKADDRS m_lpfnGetAcceptExSockaddrs; // GetAcceptExSockaddrs函数地址 private: boolDoWSAStartup(); //初始化 socket库 voidInitData(); //初始化数据 voidInitEvent(); //初始化Event boolCreateIocpPort(); //创建完成端口 voidSetCustomLastError(char* error); //设置错误 boolPostAccept(CIOCPBuffer *pBuffer); // 投递接受I/O boolPostSend(CIOCPContext *pContext, CIOCPBuffer *pBuffer); // 投递发送I/O boolPostRecv(CIOCPContext *pContext, CIOCPBuffer *pBuffer); // 投递接收I/O voidHandleIO(DWORDdwKey, CIOCPBuffer *pBuffer, DWORDdwTrans, intnError); //总请求处理 voidHandleAccept(CIOCPBuffer *pBuffer, DWORDdwTrans); //处理接收请求 voidHandleRead(CIOCPContext *pContext, CIOCPBuffer *pBuffer, DWORDdwTrans); //处理读请求 voidHandleWrite(CIOCPContext *pContext, CIOCPBuffer *pBuffer, DWORDdwTrans);//处理写请求 staticDWORD WINAPI _ListenThreadProc(LPVOIDlpParam); //监听线程 staticDWORD WINAPI _WorkerThreadProc(LPVOIDlpParam); //工作线程};
//IocpMemoryManager.h #pragma once#include <winsock2.h>#include <Mswsock.h>#include <list>#include <iostream>usingnamespace std;//此类提供IOCP 内存的管理#define BUFFER_SIZE 1024*4 // I/O请求的缓冲区大小 单次发送最大 4096// 这是per-I/O数据。它包含了在套节字上处理I/O操作的必要信息classCIOCPBuffer{public: CIOCPBuffer(); ~CIOCPBuffer(); boolisUsed; WSAOVERLAPPED ol; SOCKET sClient; // AcceptEx接收的客户方套节字 char*buff; // I/O操作使用的缓冲区 intnLen; // buff缓冲区(使用的)大小 ULONGnSequenceNumber; // 此I/O的序列号 intnOperation; // 操作类型#define OP_ACCEPT 1#define OP_WRITE 2#define OP_READ 3}; // 这是per-Handle数据。它包含了一个套节字的信息classCIOCPContext{public: CIOCPContext(); ~CIOCPContext(); boolisUsed; SOCKET s; // 套节字句柄 SOCKADDR_IN addrLocal; // 连接的本地地址 SOCKADDR_IN addrRemote; // 连接的远程地址 boolbClosing; // 套节字是否关闭 intnOutstandingRecv; // 此套节字上抛出的重叠操作的数量 intnOutstandingSend; ULONGnReadSequence; // 安排给接收的下一个序列号 ULONGnCurrentReadSequence; // 当前要读的序列号 list<CIOCPBuffer*> pOutOfOrderReadsList; // 记录没有按顺序完成的读I/O CRITICAL_SECTION Lock; // 保护这个结构}; classIocpMemoryManager{public: IocpMemoryManager(void); ~IocpMemoryManager(void); staticIocpMemoryManager* GetInstence(); intm_nMaxFreeBuffers; //最大的空闲Buffer intm_nMaxFreeContexts; //最大的空闲Contexts intm_nMaxConnections; //最大的连接数 intGetContextListCount(){returnm_contextList.size();} //Accept 操作 boolInsertAPendingAccept(CIOCPBuffer *pBuffer); boolRemoveAPendingAccept(CIOCPBuffer *pBuffer); intGetPendingAcceptCount(); //buffer 操作 CIOCPBuffer* AllocateBuffer(intnLen = BUFFER_SIZE);//buffer 申请 voidReleaseABuffer(CIOCPBuffer *pBuffer); //buffer 释放 CIOCPBuffer* GetANoUseBuffer(); //获取一个空闲的buffer intGetFreeBuffersCount(); //获取空闲的Buffer的数目 //Contexts 操作 CIOCPContext* AllocateContext(constSOCKET& sClient); //Contexts 申请 voidReleaseAContext(CIOCPContext *pBuffer); //Contexts 释放 CIOCPContext* GetANoUseContexts(); //获取一个空闲的Contexts intGetFreeContextsCount(); ////获取空闲的Contexts的数目 voidCloseAConnection(CIOCPContext *pContext); voidCloseAllConnections(); //关闭所有的socket 但不FreeContexts(); voidFreeBuffers(); //清空所有Buffers voidFreeContexts(); //清空所有Contexts // 取得下一个要读取的 CIOCPBuffer *GetNextReadBuffer(CIOCPContext *pContext, CIOCPBuffer *pBuffer); //获取工作线程最大数 = CPU个数*2{最佳} intGetMaxWorkerThreadCount(); voidHandlePendingAcceptTimeOut(); private: list<CIOCPBuffer*> m_bufferList; //统一管理 【管理所有申请的buffer】 list<CIOCPContext*> m_contextList;//统一管理 【管理所有申请的context】 list<CIOCPBuffer*> m_pPendingAcceptsList; CRITICAL_SECTION m_FreeBufferListLock; CRITICAL_SECTION m_FreeContextListLock; CRITICAL_SECTION m_PendingAcceptsLock; CRITICAL_SECTION m_ConnectionListLock;};
- iocp 完成端口封装类 内存优化 高并发 接口简单
- 高并发的IOCP(完成端口)源码
- IOCP完成端口的一个简单封装类
- IOCP完成端口的一个简单封装类 (转)
- IOCP完成端口的一个简单封装类
- IOCP完成端口的一个简单封装类
- DELPHI高性能大容量SOCKET并发(二):IOCP完成端口控件封装
- 高性能大容量SOCKET并发(二):IOCP完成端口控件封装
- 高性能大容量SOCKET并发(二):IOCP完成端口控件封装
- DELPHI高性能大容量SOCKET并发(十):IOCP完成端口性能优化
- IOCP完成端口简单Demo
- DELPHI高性能大容量SOCKET并发(一):IOCP完成端口例子介绍
- 高性能大容量SOCKET并发(一):IOCP完成端口例子介绍
- C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍
- C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍
- DELPHI高性能大容量SOCKET并发:IOCP完成端口例子介绍
- Windows服务器高并发处理IOCP(完成端口)详细说明
- Windows服务器高并发处理IOCP(完成端口)详细说明
- Debian Linux 根目录 的 目录功能规划
- GetFocus
- hive 数据倾斜总结
- 《Spring技术内幕》学习笔记1——IoC容器体系结构
- Devexpress 设置颜色
- iocp 完成端口封装类 内存优化 高并发 接口简单
- OCM JAVA_HOME does not contain java
- java二维码生成与解析代码实现
- Python的学习(十八)---- 单元测试工具nose
- ios音频播放
- MFC 双缓冲图形刷新
- python使用json格式进行数据封装
- getrusage性能
- 卡尔曼滤波简介及其算法实现代码(C++/C/MATLAB)