SWFCDB的研究与探索 第6页

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] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有