📄 iocp_class.h
字号:
//---------------------------------------------------------------------------
#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 + -