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

📄 iocp_class.h

📁 一个完成端口的框架程序
💻 H
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#ifndef IOCP_ClassH
#define IOCP_ClassH
//---------------------------------------------------------------------------
#define __DEBUG TRUE
#define __ERRORLOG TRUE
#include <winsock2.h>
#include <windows.h>
#include <vector.h>
#include <process.h>
#include <algorithm>
#include "NetWork_Utility.h"
//---------------------------------------------------------------------------
/***************************************************************/
/*                                                             */
/*           缓冲的大小直接影响到各连接初始内存的占用          */
/*           但是如果缓冲区比较大则在发送超长数据时,          */
/*           减少多次提交发送缓冲等数据流转时间消耗            */

#define MAX_BUF_LEN 1024UL*4   /*缓冲区大小*/

/*                                                             */
/*                                                             */
/***************************************************************/
//---------------------------------------------------------------------------
#define MAX_THREAD_NUMBER 64UL /*最大线程数,64为参考值,WaitForMultiObjects支持最大限额*/
#define MAX_INT64 18446744073709551615ULL /*0xFFFFFFFF*/

#define AllocEx(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))/*动态堆内存分配*/
#define FreeEx(p) HeapFree(GetProcessHeap(),0,(p))                 /*动态堆内存释放*/
//#define AllocEx(s) GlobalAlloc(GPTR,(s))
//#define FreeEx(p) GlobalFree((p))
//---------------------------------------------------------------------------
/* I/O C.P. Server Working State enumerate values*/
//服务器状态
//运行状态和用户调节值(期望值)
//LS_CLOSED:服务器尚未启动,或者已经停止
//LS_SHUTDN:服务器预停止,用于通知各运行例程只用于完成现有的任务,而不再接手新任务
//LS_PAUSE:主要是暂停监听线程,不再执行Accept,而不影响其它现有的连接正常工作
//LS_WORK:工作态
typedef enum {
   LS_CLOSED = 0 /*State Closed for working-state only*/,
   LS_SHUTDN = 1 /*State Closing for tuning-state only*/,
   LS_PAUSE  = 2 /*State Pausing for tuning-state,
                   or Paused for working-state*/,
   LS_WORK   = 3 /*State working,
                   both working-state and tuning-state*/
} TEnumListenState;

//---------------------------------------------------------------------------
/* Input or Output operation state*/
//输入(WSARecv)/输出(WSASend)标识
typedef enum _IO_OPER{
   SVR_IO_READ  = 0, /*Input*/
   SVR_IO_WRITE = 1, /*Output*/
   OOB_IO_READ  = 2, /*OOB Input*/
   OOB_IO_WRITE = 3  /*OOB Output*/
}IO_OPER;

//---------------------------------------------------------------------------
/*Patulous structure of overlapped I/O operation*/
//重叠I/O信息扩展结构体,用于在原重叠I/O结构体当中扩展一些用户数据
//
//OverLapped:原始重叠I/O信息结构体
//wbuf:网络数据缓冲区对象,由缓冲区长度和缓冲区首指针组成
//data:结构体临时缓冲区
//flags:标识,则WSASend和WSARecv使用
//LockCount:使用次数,特别是可能多次提交
//          标示有N个未决作业请求
//         (实际上对于一个结构体,最多只能使用一次)
//WorkingThreadID:前一次提交网络事件的工作线程ID号
typedef struct __OVERLAPPEDEX{
   WSAOVERLAPPED OverLapped;
   WSABUF wbuf;
   char data[MAX_BUF_LEN+6];
   IO_OPER oper;
   bool DataInExtend;
   unsigned long flags;
   long LockCount;
   #ifdef __DEBUG
   DWORD WorkingThreadID;
   #endif
   UINT Length;
   UINT SentBytes;
}OVERLAPPEDEX,far *LPOVERLAPPEDEX;

//---------------------------------------------------------------------------
/*structure of Data element*/
//数据元素链式结构体
//
//Length:数据缓冲区实际数据总长度
//SentBytes:已完成提交的数据长度
//Buffer:数据缓冲区
//Next:链式指针
typedef struct __IODATA{
   UINT Length;    //Total bytes
   UINT SentBytes; //Sent bytes
   char Buffer[MAX_BUF_LEN];
   struct __IODATA *Next;
}IODATA,far *LPIODATA;

//---------------------------------------------------------------------------
/*structure of Data unit*/
//数据单元链式结构体,由一个或多个数据元素结构组成
//
//Data:数据链
//Next:链式指针
typedef struct __IODATANode{
   LPIODATA Data;               /*temporary I/O Data*/
   struct __IODATANode *Next;   /*Forward Pointer   */
}IODATANode,far *LPIODATANode;

//---------------------------------------------------------------------------
/*structure of Connection Context */
//用户连接上下文结构体
//
//ctx_CriticalSection:上下文内部操作数据链所用临界区
//TotalSent:用户连接总发送完成数据量
//TotalRecv:用户连接总接收完成数据量
//I_OverLappedEx:接收数据重叠I/O扩展结构
//O_OverLappedEx:发送数据重叠I/O扩展结构
//O_DATA:待发送数据队列
//LastDataTime:最后一次网络事件(接收或发送)的时间
//             用于检测超时,而无动作的准恶性连接
//RemoteAddr:用户IP
//RemotePort:用户端口
//DataInExtend:为合理利用缓冲区,尽可能先使用重叠I/O结构体缓冲区存储待发送数据
//             而后再考虑申请新的发送缓冲区存储待发送数据,True有待发送数据在重叠缓冲区
//InDumping:连接是否已置于回收站
//          当一个连接上面发生错误时,则先置于回收站当中,交给定时器进一步处理
//sockAccept:Accept得到的Socket
//Length:发送重叠I/O缓冲区当中总共待发送的长度
//SentBytes:发送重叠I/O缓冲区当中已发送的长度
typedef struct __CONN_CTX{
   CRITICAL_SECTION ctx_CriticalSection;
   unsigned __int64 TotalSent;
   unsigned __int64 TotalRecv;
   LPOVERLAPPEDEX I_OverLappedEx;
   LPOVERLAPPEDEX O_OverLappedEx;
   LPIODATANode O_DATA;
   long LastDataTime;
   char RemoteAddr[18]; /*Client's IP  */
   bool InDumping;
   SOCKET sockAccept;   /*Accepted Sock*/
   int RemotePort;      /*Client's Port*/
}CONN_CTX,far *LPCONN_CTX;                     

//---------------------------------------------------------------------------
//Handle vector类型,主要用于存储线程名柄等
typedef vector<HANDLE> VTCHandle;
//DWORD Vector类型,主要用于存储线程ID等
typedef vector<DWORD> VTCThreadID;
//用户连接上下文vector类型,用于存储用户连接上下文
typedef vector<LPCONN_CTX> VTCCONN_CTX;

//---------------------------------------------------------------------------
///////////////////////////////////////////////
//             Threads executant             //
///////////////////////////////////////////////

//Listen thread executant,for acceptor blocking
//监听(执行Accept)的线程过程
unsigned WINAPI ListenerThread(LPVOID lpParam);

//Purifier thread executant,do something timed
//时脉(定时器)函数过程
//uTimerID:定时器的唯一标识ID
//dwUser:用户数据,即timeSetEvent传递过来的用户数据
//uMsg,dw1,dw2:保留字段,不具备任何意义
void CALLBACK PurifierTimerProc(UINT uTimerID,
                                UINT uMsg,
                                DWORD_PTR dwUser,
                                DWORD_PTR dw1,
                                DWORD_PTR dw2);
unsigned WINAPI PurifierThread(LPVOID lpParam);
//worker thread executant,for all I/O C.P. workers
unsigned WINAPI WorkerThread(LPVOID lpParam);

//---------------------------------------------------------------------------

/******************************************************************/
/*                       此以下为主体类的定义                     */
/******************************************************************/
/*I/O C. P. Class*/
class TtcpIOCP
{

/*For Class*/
//Global_CriticalSection:类全局临界区
//                       主要用于定时处理过程阻部分数据处理过程的重入
//TimedCounter:定时器时脉计数
//FCPUCount:当前主机CPU数量
private:
   //CRITICAL_SECTION Global_CriticalSection;
   HANDLE EventArray[2];
   long TimedCounter;
   UINT FCPUCount;/*CPU Count*/

/*For IOCP*/
//FHandle:完成端口句柄
//FIOCPInavlid:完成端口等相关作业前置例程初始化是否完成
//FEchoServer:是否置简单回显服务状态(用于调试)
//Reserve:(保留未用),用于发行版的数据对齐,替代回显服务标识占位
private:
   //Handle to the I/O C.P.
   HANDLE FHandle;
   //Handle Valid
   bool FIOCPInvalid;
   #ifdef __DEBUG
   bool FEchoServer;
   #else
   unsigned char Reserve;  //Align Byte
   #endif
/*For Server Thread*/
//FRunningState:服务器运行状态(关闭,暂停等)
//FTuningListenState:用户调节服务器状态设置值
//                   预期运行状态值
//FBindAddress:服务器绑定地址
//FPort:监听端口号
//FListenSock:用于监听的SOCKET
//FListenThread:监听线程句柄
private:
   //Service State
   TEnumListenState FRunningState;
   //Tuning Service State
   TEnumListenState FTuningListenState;
   //Bind Address
   char FBindAddress[16];
   //Listen Port
   int FPort;
   //Listen Socket
   SOCKET FListenSock;
   //Listen Thread Handle
   HANDLE FListenThread;

/*For Purifier Thread*/
//定时器唯一标识
private:
   UINT FPurifierTimer;
   HANDLE FPurifierThread;
   unsigned FPurifierThreadID;
/*For Client(s) */
//FConnectionList:用户连接列表
//FrecycleConnectionList:用户连接回收站
//conn_CriticalSection:用户连接列表操作临界区
//conn_DUMP_CriticalSection:用户连接回收站操作临界区
//BytesSentPerInterval:单位时间内发送数据比特量
//BytesRecvPerInterval:单位时间内接收数据比特量
/************************************************
/////////////////////////////////////////////////
由于需要显示相关流量计数时,不能由时脉直接产生事件
而延长时脉工作时间,使其产生识差,
所以在重置相关单位时间流量计数时,取一采样数据
/////////////////////////////////////////////////
*************************************************/
//BytesSentSampSpeed:单位时间内发送数据采样比特量
//BytesRecvSampSpeed:单位时间内接收数据采样比特量
//////////////////////////////////////////////////
//FMaxConnections:最大连接数

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -