⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iocpmanager.h

📁 iocp vc例子,自己是学DELPHI
💻 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 + -