www.pudn.com > NetCompletionPort.rar > NetCompletionPort.h


#ifndef _COMPLETIONPORT_H 
#define _COMPLETIONPORT_H 
 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
 
#define MAX_MEM_COUNT   1000 
#define MAX_BUF         1024 
#define RECV_COUNT      5 
 
#pragma pack (push) 
#pragma pack (1) 
 
enum 
{ 
	IO_ACCEPT, 
	IO_READ, 
	IO_WRITE, 
	IO_END, 
}; 
 
enum 
{  
	IO_SEND, 
	IO_RECV 
}; 
 
 
//单IO数据 
typedef struct _PER_IO_CONTEXT 
{ 
	WSAOVERLAPPED ol; 
	char buf[MAX_BUF]; 
	WSABUF wsabuf; 
	SOCKET sClient; 
	DWORD id; 
	BYTE IoOperation; 
}PER_IO_CONTEXT,*LPPER_IO_CONTEXT; 
 
//完成键(单句炳数据) 
typedef struct _PER_HANDLE_CONTEXT 
{ 
	SOCKET IoSocket; 
 
}PER_HANDLE_CONTEXT,*LPPER_HANDLE_CONTEXT; 
 
static GUID g_GUIDAcceptEx             = WSAID_ACCEPTEX; 
static GUID g_GUIDGetAcceptExSockaddrs = WSAID_GETACCEPTEXSOCKADDRS; 
 
class WorkThread 
{ 
private: 
	HANDLE m_hThread; 
	unsigned int  m_nThreadID; 
	unsigned int (__stdcall*pnThreadFun)(LPVOID param); 
	void* m_pParam; 
public: 
	WorkThread(); 
	WorkThread(unsigned int (__stdcall*pnThreadFun)(LPVOID param),void* param); 
	~WorkThread(); 
	bool Init(); 
	void Start(); 
	void Stop(); 
	void SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam); 
	void SetPriority(int priority); 
}; 
 
class NetClient  
{ 
public: 
	SOCKET m_socket; 
	SOCKADDR_IN m_address; 
	LPPER_HANDLE_CONTEXT m_pComKey; 
	NetClient(); 
	NetClient(int socket); 
	~NetClient(); 
	void SendPacket(void* pData,bool encrypt = TRUE); 
	void Disconnect(); 
}; 
 
class NetCompletionPort 
{ 
private: 
	LPFN_ACCEPTEX m_pAcceptEx; 
	LPFN_GETACCEPTEXSOCKADDRS m_pGetAcceptExSockaddrs; 
	HANDLE m_comPort; 
	int    m_port; 
	SOCKET m_listenSocket; 
	HANDLE m_hEventListen; 
	bool m_isCreate; 
 
	std::vector* m_pWorkThreadList; 
	WorkThread* m_pThreadAccept; 
 
	bool InitWinSock(); 
	bool InitListenSocket(); 
	bool InitListenEvent(); 
	bool InitWorkThread(); 
	 
	std::map* m_pClientList; 
	CRITICAL_SECTION m_clientListSection; 
	void DeleteClient(NetClient* pClient); 
	void AddClient(NetClient* pClient); 
	NetClient* GetClient(int socket); 
	 
	std::set* m_pConnectList; 
	CRITICAL_SECTION m_conSection; 
	void InsertConnect(LPPER_IO_CONTEXT pConnect); 
	void ReleaseConnect(int socket); 
	 
	std::deque* m_pIoMemList; 
	std::deque* m_pHandleMemList; 
	CRITICAL_SECTION m_ioMenListSection; 
	CRITICAL_SECTION m_hdMemListSection; 
	LPPER_IO_CONTEXT GetIoMem(); 
	LPPER_HANDLE_CONTEXT GetHandleMem(); 
	void InsertIoMem(LPPER_IO_CONTEXT pMem); 
	void InsertHandleMem(LPPER_HANDLE_CONTEXT pMem); 
 
	bool PostAcceptEx(); 
	 
protected: 
public: 
	NetCompletionPort(); 
	virtual ~NetCompletionPort(); 
	bool StartServer(int port); 
	void StopServer(); 
 
	virtual bool Disconnect(int socket); 
	void SendPacket(int socket,void * pData,bool encrypt = TRUE); 
	virtual void EncryptPacket(void * pData,int & length,BYTE type,bool encrypt = TRUE); 
	virtual void RecvData(void * pData,NetClient* pClient); 
	 
	void AcceptEvent(LPPER_IO_CONTEXT pIo,LPPER_HANDLE_CONTEXT pHd,DWORD dwByte); 
	void SendEvent(LPPER_IO_CONTEXT pIo,LPPER_HANDLE_CONTEXT pHd,DWORD dwByte); 
	void RecvEvent(LPPER_IO_CONTEXT pIo,LPPER_HANDLE_CONTEXT pHd,DWORD dwByte); 
	void CloseEvent(LPPER_IO_CONTEXT pIo,LPPER_HANDLE_CONTEXT pHd); 
 
	static unsigned __stdcall WorkThreadFun(LPVOID param); 
	static unsigned __stdcall AcceptThreadFun(LPVOID param); 
	 
}; 
 
#pragma pack (pop) 
 
#endif