iocp完成端口封装类 内存优化 高并发 接口简单(二)
ude
#include
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 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 m_bufferList; //统一管理 【管理所有申请的buffer】
list m_contextList;//统一管理 【管理所有申请的context】
list m_pPendingAcceptsList;
CRITICAL_SECTION m_FreeBufferListLock;
CRITICAL_SECTION m_FreeContextListLock;
CRITICAL_SECTION m_PendingAcceptsLock;
CRITICAL_SECTION m_ConnectionListLock;
};