📄 iocpmanager.h
字号:
// IocpManager.h: interface for the CIocpManager class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_IOCPMANAGER_H__5A102476_2C80_4465_954C_24B05D9EF3C3__INCLUDED_)
#define AFX_IOCPMANAGER_H__5A102476_2C80_4465_954C_24B05D9EF3C3__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxsock.h>
//定义xml中的节点名
#define XML_IOCPMANAGER_DEFAULT_PATH _T("DefaultPath") //临时文件路径
//定义IOCP的配置参数
#define NUMBER_OF_CONCURRENT_PER_CPU 2 //每个CPU支持的处理完成端口信息线程数
#define NUMBER_OF_IOCP_WORKER_THREAD 2 //处理IOCP请求的工作线程数
#define NUMBER_OF_PENDING_READ 3 //同一个套接字可同时读的请求数
#define MAX_NUMBER_OF_CONNECTION 1000 //服务器最大的连接数
#define NUMBER_OF_ACCEPTEX 50 //一次投递AcceptEx请求的次数
#define MAX_LISTEN_PENDING_CONNECTION 50 //监听时最大处理连接数
#define MAX_NUMBER_OF_FREE_BUFFER_LIST 2000 //最大的空闲缓冲区数
#define MAX_NUMBER_OF_FREE_CONTEXT_LIST 100 //最大的空闲连接数
#define MAX_NUMBER_OF_FREE_PACKET_LIST 100 //最大的空闲命令包数
#define NUMBER_OF_TASK_PROCESS_THREAD 2 //处理接收任务的线程数
#define MAX_NUMBER_OF_TASK_LIST 1000 //最大的任务数
#define PERCENT_INFO_TRANSFER_PROGRESS 2 //进度更新的最小百分比
#define MAX_NUMBER_OF_WAIT_SEND_LIST 200 //最大的同步命令数
struct IOCPWAITSEND
{
CIocpContext* pContext;
GUID gdWait;
HANDLE hWaitEvent;
CIocpPacket* pWaitPacket;
IOCPWAITSEND() {memset(this, 0, sizeof(IOCPWAITSEND));};
};
typedef CArray<IOCPWAITSEND, IOCPWAITSEND&> CIocpWaitSendArray;
class AFX_EXT_CLASS CIocpManager
{
public:
CIocpManager();
virtual ~CIocpManager();
CString GetIocpVersion() {return _T("0.5.233");}; //获得版本号
//Iocp控制
private:
CItemComposite m_itemIocp; //完成端口的配置信息
int m_nWSAStartupRet; //记录WSAStartup的结果
BOOL m_bIocpStarted; //IOCP是否启动标识
private:
int InitConfig(); //初始化完成端口的配置信息
void CloseSocket(SOCKET& soSocket); //关闭套接字
public:
int Start(int nPortNumber); //启动完成端口
int Stop(); //停止完成端口
int Connect(CString strServerAddr, int nServerPort); //连接服务器
//完成端口控制
private:
HANDLE m_hCompletionPort;
private:
int CreateCompletionPort(); //创建完成端口
int AssociateSocketWithCompletionPort(SOCKET socket, HANDLE hCompletionPort, DWORD dwCompletionKey); //将完成端口与套接字关联
int AssociateSocketWithContext(SOCKET soSocket, CIocpBuffer* pBuf=NULL, SOCKADDR_IN* pRemoveAddr=NULL); //关联套接字与上下文连接
//监听操作控制
private:
int m_nListenPortNumber; //监听端口号,客户端一般小于等于0
SOCKET m_soListen; //监听套接字
LONG m_nNumberOfAcceptEx; //当前AcceptEx请求数
LPFN_ACCEPTEX m_lpAcceptEx; //AcceptEx函数指针
LPFN_GETACCEPTEXSOCKADDRS m_lpGetAcceptExSockAddrs; //GetAcceptExSockAddrs函数指针
private:
int CreateListenPort(int nListenPort); //创建监听端口
int CreateAcceptEx(); //创建多次AcceptEx请求
//完成端口处理线程控制
private:
LONG m_lIocpWorkerCount; //处理线程数
private:
int CreateIocpWorkerThread(); //创建处理完成端口线程
static DWORD WINAPI IocpWorkerThread(LPVOID lpParam); //负责处理完成端口请求的工作线程
int StopIocpWorkerThread(); //停止完成端口处理线程
//连接上下文控制
private:
CCriticalSection m_csFreeContext;
CPtrList m_plFreeContext; //空闲上下文连接数组
public:
CCriticalSection m_csUsedContext;
CPtrList m_plUsedContext; //使用上下文连接数组
private:
CIocpContext* AllocateContext(); //分配连接上下文
int DisconnectContext(CIocpContext* pIocpContext); //断开连接上下文
int ReleaseContext(CIocpContext* pIocpContext); //释放连接上下文
int DisconnectAllContext(); //断开所有连接
void FreeContext(); //释放空间
public:
CIocpContext* FindContext(int nSocket); //查打连接上下文
int DisconnectContext(int nSocket); //断开连接上下文
//缓冲区控制
private:
CCriticalSection m_csFreeBuf;
CPtrList m_plFreeBuffer; //空闲缓冲区数组
CCriticalSection m_csUsedBuf;
CPtrList m_plUsedBuffer; //使用缓冲区数组
private:
CIocpBuffer* AllocateBuffer(int nIoType); //分配缓冲区
int ReleaseBuffer(CIocpBuffer* pBuf); //释放缓冲区
int ProcessBuffer(CIocpContext* pContext, CIocpBuffer* pBuf); //处理缓冲区数据
void FreeBuffer(); //释放空间
//完成端口处理消息控制
private:
int ProcessIocpMessage(CIocpContext* pIocpContext,
CIocpBuffer* pOverlappedBuf, DWORD dwIoSize); //处理I/O请求
int OnInitialize(CIocpContext* pContext, CIocpBuffer* pBuf); //初始化套接字请求
int PostAcceptEx(); //投递一次AcceptEx请求
int OnAcceptEx(CIocpBuffer* pBuf); //处理AcceptEx请求
int PostRead(CIocpContext* pContext, CIocpBuffer* pBuf=NULL); //投递读数据请求
int OnInitRead(CIocpContext* pContext, CIocpBuffer* pBuf); //处理初始化读数据请求
int OnRead(CIocpContext* pContext, CIocpBuffer* pBuf, DWORD dwIoSize); //处理读数据请求
int PostWrite(CIocpContext* pContext, CIocpBuffer* pBuf); //投递写数据请求
int OnInitWrite(CIocpContext* pContext, CIocpBuffer* pBuf); //处理初始化写数据请求
int OnWrite(CIocpContext* pContext, CIocpBuffer* pBuf, DWORD dwIoSize); //处理写数据请求
//同步或异步命令控制
public:
int SendData(int nSocket, CIocpPacket* pPacket, CIocpPacket* pAnsPacket=NULL, DWORD dwWaitTime=60000); //同步发送数据
int SendData(CIocpContext* pContext, CIocpPacket* pPacket, CIocpPacket* pAnsPacket=NULL, DWORD dwWaitTime=60000); //同步发送数据
int CancelSendData(int nSocket, ULONG ulKey); //取消数据包发送
int CancelSendData(CIocpContext* pContext, ULONG ulKey); //取消数据包发送
//网络命令处理对象控制
private:
CCriticalSection m_csWriterProcess; //写者临界区
CCriticalSection m_csReaderCountProcess; //读者数临界区
int m_nReaderCount; //读者数
CPtrList m_plProcess; //处理对象数组
public:
int Processing(IOCPTASK& itTask); //处理网络命令
public:
int AddProcess(CIocpProcess* pProcess); //添加处理对象
int RemoveProcess(CIocpProcess* pProcess); //删除处理对象
//发送或接收数据的顺序控制
private:
void ReleaseBufferMap(CBufferMap& mapBuffer); //释放缓冲区
CIocpBuffer* GetNextSendBuffer(CIocpContext* pContext, CIocpBuffer* pBuffer=NULL); //获取当前需要发送的缓冲区
CIocpBuffer* GetNextRecvBuffer(CIocpContext* pContext, CIocpBuffer* pBuffer=NULL); //获取当前需要接收的缓冲区
void SetSendSequenceNumber(CIocpContext* pContext, CIocpBuffer* pBuffer); //设置发送顺序号
void IncreaseSendSequenceNumber(CIocpContext* pContext); //增加上下文连接的当前发送顺序号
void IncreaseRecvSequenceNumber(CIocpContext* pContext); //增加上下文连接的当前接收顺序号
//接收时临时文件的默认目录
private:
CString m_strDefaultPath; //默认文件接收路径
public:
void SetDefaultPath(CString strDefaultPath)
{if (!strDefaultPath.IsEmpty()) m_strDefaultPath = strDefaultPath;}; //设置默认路径
//网络消息处理控制
private:
CCriticalSection m_csTask;
CIocpTaskList m_listTask; //网络任务数组
private:
BOOL AddTask(IOCPTASK& itTask); //添加任务到数组中
BOOL GetTask(IOCPTASK& itTask); //从数组读取任务
void RemoveTask(CIocpContext* pContext=NULL); //从数组中删除任务
private:
LONG m_lTaskProcessCount; //任务处理线程数
HANDLE m_hStopEvent; //停止事件句柄
private:
int CreateTaskProcessThread(); //创建任务处理线程
static DWORD WINAPI TaskProcessThread(LPVOID lpParam); //负责任务处理的线程
int StopTaskProcessThread(); //停止任务处理线程
//同步命令控制
private:
CCriticalSection m_csWaitSend;
CIocpWaitSendArray m_aWaitSend; //同步事件映射数组
private:
BOOL AddWaitSend(IOCPWAITSEND& iwWaitSend); //添加等待的事件对象
void RemoveWaitSend(CIocpContext* pContext=NULL); //释放数组中所有等待事件对象
public:
void ReleaseWaitEvent(HANDLE& hWaitEvent); //释放等待事件
BOOL GetWaitSend(GUID& gdPacket, IOCPWAITSEND& iwWaitSend, BOOL bRemove=TRUE); //获得等待的事件对象,并从数组中删除
};
#endif // !defined(AFX_IOCPMANAGER_H__5A102476_2C80_4465_954C_24B05D9EF3C3__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -