首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

iocp 完成端口封装类 内存优化 高并发 接口容易

2013-01-26 
iocp 完成端口封装类 内存优化 高并发 接口简单文章转自王牌软件---- class Iocp //完成端口 功能类class

iocp 完成端口封装类 内存优化 高并发 接口简单
文章转自王牌软件---- 

class Iocp //完成端口 功能类
class IocpMemoryManager //此类提供IOCP 内存的管理

//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;};


热点排行