SWFCDB的研究与探索 第6页
CIocp(void);
~CIocp(void);
friend IOCP_RET WINAPI IOCPStartAsThread(LPVOID lParam);
//声明服务器线程函数为该类友元函数,可以访问该类的私有成员
friend DWORD WINAPI ServerWorkerThread(LPVOID lParam);
//声明服务器工作者线程函数为该类友元函数,可以访问该类的私有成员
friend DWORD WINAPI ThreadPoolManager(LPVOID lParam);
//声明线程池管理者函数为该类友元函数
friend DWORD WINAPI ThreadPoolWorker(LPVOID lParam);
//声明线程池工作者线程函数为该类友元函数
//attributes
private:
typedef LPIOCP_OVERLAPPED_DATA (*_GetIOCP_OVERLAPPED_DATA) (DWORD dwThreadID);
//定义完成端口内存管理接口GetIOCP_OVERLAPPED_DATA() 方法本类内回调
//函数原型。功能:从系统预先分配的 IOCP重叠结构“单I/O操作数据”缓冲区//取得一 IOCP重叠结构“单I/O操作数据”;如果成功,返回指向一IOCP重
//叠结构“单I/O操作数据”的指针;如果失败,返回NULL
char cError[256];
//用于保存出错信息
char cServerIPList[16*16];
//保存服务器的IP列表,假设一个服务器的IP数目不超过16个
std::list<DATA_STACK_ITEM> sendQueue;
//定义初次发送失败的数据队列,初次发送失败的数据都存入该队列中
std::list<DATA_STACK_ITEM> recvQueue;
//定义未处理的数据队列,IOCP服务器工作者线程只负责收发数据,不处理接收到//的收据,将接收到的数据放入未处理数据队列中,交由数据处理线程处理数据
CRITICAL_SECTION csSendQueue;
//初次发送失败数据队列临界区
CRITICAL_SECTION csRecvQueue;
//接收数据队列临界区
DWORD dwConnectCount;
//当前服务器连接客户端数
HANDLE hCompletionPort;
//服务器完成端口句柄
LPIOCP_RECV_CALLBACK pRecvCallBack;
//指向服务器接收到数据后,客户端对数据处理的回调函数
HANDLE hRecvEvent;
//同步Event核心对象,当向接收数据队列临界区添加数据时,将其设为传信,通知线
//程池管理管理新加入了数据
int iPort;
//保存服务器侦听端口号
THREAD_POOL_PARAM threadPoolParam;
//传向线程池管理者线程参数
bool bExit;
//true则服务器将关闭,false则服务器暂不关闭
HANDLE hThreadServer;
//指向服务器线程句柄
HANDLE hThreadPoolManager;
//指向线程池管理者线程句柄
DWORD dwThreadID;
//服务器线程ID
public:
DWORD dwServerRecvedBytes;
//服务器从启动开始接受客户端发送的字节总数
DWORD dwServerSendedBytes;
//服务器从启动开始发送给客户端的字节总数
//operates
public:
IOCP_RET WINAPI IOCPStart(LPIOCP_RECV_CALLBACK callback, int port, DWORD dwThreadPoolWorkerCount=5);
//启动IOCP服务器。callback 为指向对接收数据操作的回调函数,//dwThreadPoolWorkerCount 为处理接收数据创建的工作者线程数目,port 为服务 //器侦听端口号
IOCP_RET IOCPClose(int iMaxWaitTime=10);
//关闭IOCP服务器,iMaxWaitTim为关闭服务器能承受的最大等待时间,以秒为单位
private:
IOCP_RET IOCPRecvTaskInsertQueue(const LPPER_IO_DATA pPerIoData, const LPIOCP_OVERLAPPED_DATA pIOD);
// 处理接收操作,将接收到的任务插入任务队列
void IOCPGetServerIPList();
//获得服务器的IP地址列表
public:
IOCP_RET IOCPSend(LPPER_IO_DATA pData);
//发送数据操作
char* IOCPGetLastError();
//返回错误信息
DWORD IOCPGetClientCount();
//返回连接客户端数
_GetIOCP_OVERLAPPED_DATA IOCPGetOverlappedData;
//完成端口内存管理接口 函数指针,用于从完成端口内存管理接口获得一 IOCP
//重叠结构“单I/O操作数据”
DWORD IOCPGetServerThreadID();
//返回服务器线程ID;
const char* IOCPGetServerIP();
//返回服务器IP地址,若有多IP,则是IP list
protected:
virtual void IOCPRecv(const LPTASK_QUEUE_ITEM pTQI, CIocp* pIocp);
//派生类用于处理接收到的数据,及接收数据后的操作
virtual void IOCPAcceptClient(const SOCKET /*socket*/);
//派生类用于处理接受客户端连接操作
virtual void IOCPClientClose();
//派生类用于处理客户端关闭事件
};
4.4.5 客户端接口实现
客户端基于Event Select 异步I/O 模型设计,具体实现封装在CEventClient 类中。该类主要提供Connect(),Recv(),Send(),CloseClient(),ServerClosed()等函数完成与服务器通讯。
完成端口服务器接口和Event Select 客户端接口的实现见:Iocp.h 和 Iocp.cpp 两文件。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页
SWFCDB的研究与探索 第6页下载如图片无法显示或论文不完整,请联系qq752018766