iocp完成端口封装类 内存优化 高并发 接口简单
class Iocp //完成端口 功能类class IocpMemoryManager //此类提供IOCP 内存的管理[cpp]#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; //错误信息 取得最后一个错误信息//EventHANDLEm_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(); //初始化EventboolCreateIocpPort(); //创建完成端口voidSetCustomLastError(char* error); //设置错误boolPostAccept(CIOCPBuffer *pBuffer); // 投递接受I/OboolPostSend(CIOCPContext *pContext, CIOCPBuffer *pBuffer); // 投递发送I/OboolPostRecv(CIOCPContext *pContext, CIOCPBuffer *pBuffer); // 投递接收I/OvoidHandleIO(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); //工作线程};[cpp]//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};&nbs补充:软件开发 , C++ ,
上一个:SDUT 1266 出栈序列统计
下一个:多重继承--读松本行弘的程序世界
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊