www.pudn.com > 221315556.rar > ClientSocket.h


#pragma once 
#include "socket.h" 
#include "basethread.h" 
#include "public.h" 
#include "support.h" 
/* 
class CSimpleMsgQueue 
{ 
public: 
	BOOL	SaveMsg( char * msgbuf, int len ) 
	{ 
		int leftlen = 0; 
		int continuelen = 0; 
		if( len <= 0 ) 
			return FALSE; 
		if( m_Putptr >= m_Getptr ) 
		{ 
			continuelen = MAXCLIENTBUFFER - m_Putptr; 
			leftlen = continuelen + m_Getptr; 
			if( len > leftlen ) 
				return FALSE; 
			if( len > continuelen ) 
			{ 
				memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, continuelen ); 
				memcpy( this->m_MsgBuffer, msgbuf, len - continuelen ); 
			} 
			else 
			{ 
				memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, len ); 
			} 
		} 
		else 
		{ 
			continuelen = m_Getptr - m_Putptr; 
			leftlen = continuelen; 
			if( len > leftlen ) 
				return FALSE; 
			memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, len ); 
		} 
 
		m_Putptr = (m_Putptr + len) % MAXCLIENTBUFFER; 
		//printf( "Put msg put = %d get = %d\n", m_Putptr, m_Getptr ); 
		return TRUE; 
	}; 
	BOOL	GetMsg( SCMSG * pmsg ) 
	{ 
		int leftlen = 0; 
		char * buf = (char *)pmsg; 
		int continuelen = 0; 
		if( m_Getptr == m_Putptr ) 
			return FALSE; 
		if( m_Putptr > m_Getptr ) 
		{ 
			continuelen = m_Putptr - m_Getptr; 
			leftlen = continuelen; 
			if( MSGLENGTH > leftlen ) 
				return FALSE; 
			memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], MSGLENGTH ); 
		} 
		else 
		{ 
			continuelen = MAXCLIENTBUFFER - m_Getptr; 
			leftlen = m_Putptr + continuelen; 
			if( MSGLENGTH > leftlen ) 
				return FALSE; 
			if( MSGLENGTH > continuelen ) 
			{ 
				memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], continuelen); 
				memcpy( (void*)&buf[continuelen], (void*)this->m_MsgBuffer, MSGLENGTH - continuelen ); 
			} 
			else 
			{ 
				memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], MSGLENGTH ); 
			} 
		} 
		 
		m_Getptr = (m_Getptr + MSGLENGTH) % MAXCLIENTBUFFER; 
 
		return TRUE; 
	}; 
	VOID	Clean() 
	{ 
		m_Getptr = 0; 
		m_Putptr = 0; 
	} 
	CSimpleMsgQueue() 
	{ 
		m_Getptr = 0; 
		m_Putptr = 0; 
	}; 
	~CSimpleMsgQueue() 
	{ 
	}; 
private: 
	UINT	m_Getptr; 
	UINT	m_Putptr; 
	CHAR	m_MsgBuffer[MSGLENGTH * 1024]; 
}; 
*/ 
#ifndef CSSMsgQueue 
class CSSMsgQueue2 
{ 
public: 
	CSSMsgQueue2() 
	{ 
		m_Getptr = 0; 
		m_Putptr = 0; 
	}; 
	virtual ~CSSMsgQueue2() 
	{ 
	}; 
	BOOL Clean() 
	{ 
		m_Getptr = 0; 
		m_Putptr = 0; 
		return TRUE; 
	}; 
	BOOL	SaveMsg( char * msgbuf, int len ) 
	{ 
		int leftlen = 0; 
		int continuelen = 0; 
		if( len <= 0 ) 
			return FALSE; 
		if( m_Putptr >= m_Getptr ) 
		{ 
			continuelen = MAXSERVERBUFFER - m_Putptr; 
			leftlen = continuelen + m_Getptr; 
			if( len > leftlen ) 
				return FALSE; 
			if( len > continuelen ) 
			{ 
				memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, continuelen ); 
				memcpy( this->m_MsgBuffer, msgbuf, len - continuelen ); 
			} 
			else 
			{ 
				memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, len ); 
			} 
		} 
		else 
		{ 
			continuelen = m_Getptr - m_Putptr; 
			leftlen = continuelen; 
			if( len > leftlen ) 
				return FALSE; 
			memcpy( &this->m_MsgBuffer[m_Putptr], msgbuf, len ); 
		} 
 
		m_Putptr = (m_Putptr + len) % MAXSERVERBUFFER; 
		//printf( "Put msg put = %d get = %d\n", m_Putptr, m_Getptr ); 
		return TRUE; 
	}; 
	BOOL	GetMsg( SSMSG * pmsg ) 
	{ 
		int leftlen = 0; 
		char * buf = (char *)pmsg; 
		int continuelen = 0; 
		if( m_Getptr == m_Putptr ) 
			return FALSE; 
		if( m_Putptr > m_Getptr ) 
		{ 
			continuelen = m_Putptr - m_Getptr; 
			leftlen = continuelen; 
			if( SSMSGLENGTH > leftlen ) 
				return FALSE; 
			memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], SSMSGLENGTH ); 
		} 
		else 
		{ 
			continuelen = MAXSERVERBUFFER - m_Getptr; 
			leftlen = m_Putptr + continuelen; 
			if( SSMSGLENGTH > leftlen ) 
				return FALSE; 
			if( SSMSGLENGTH > continuelen ) 
			{ 
				memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], continuelen); 
				memcpy( (void*)&buf[continuelen], (void*)this->m_MsgBuffer, SSMSGLENGTH - continuelen ); 
			} 
			else 
			{ 
				memcpy( (void*)buf, &this->m_MsgBuffer[m_Getptr], SSMSGLENGTH ); 
			} 
		} 
 
		m_Getptr = (m_Getptr + SSMSGLENGTH) % MAXSERVERBUFFER; 
 
		return TRUE; 
	}; 
private: 
	UINT	m_Getptr; 
	UINT	m_Putptr; 
	CHAR	m_MsgBuffer[SSMSGLENGTH * 1024]; 
}; 
#endif 
class CClientSocketThread:public CBaseThread 
{ 
protected: 
	char	m_recvBuffer[2048]; 
	DWORD	Proc( LPVOID lpParam ); 
}; 
#define GAMECLIENTMODE	0 
#define GAMESERVERMODE	1 
#define THREAD_SOCKET		0 
#define MANUAL_SOCKET		(1<<16) 
class CClientSocket 
{ 
	friend class CClientSocketThread; 
public: 
	CClientSocket(void); 
	CClientSocket( int mode ); 
	virtual ~CClientSocket(void); 
protected: 
	SOCKET		m_sClient; 
	CSocket	m_socket; 
	CClientSocketThread	* m_pClientThread; 
	int	m_Mode; 
//	DWORD	m_dwFlag; 
private: 
	CSimpleMsgQueue	* m_pMsgQueue; 
	CSSMsgQueue2	*	m_pSSMsgQueue; 
	char	m_recvBuffer[2048]; 
public: 
	// 连接服务器 
	BOOL Connect(const char * IpAddress, const unsigned int Port); 
	// 断开连接 
	BOOL Disconnect(void); 
	// 清除消息队列存储区 
	virtual BOOL CleanBuffer(void); 
	virtual BOOL	SendMsg(SSMSG*); 
	virtual BOOL	GetMsg( SSMSG*); 
	// 取得一个消息 
	virtual BOOL GetMsg(SCMSG* pmsg); 
	// 发送一个消息 
	virtual BOOL SendMsg(SCMSG* pmsg); 
	virtual BOOL IsConnected(void); 
	virtual BOOL SaveMsg(CHAR * pBuffer , int nSize); 
	virtual BOOL	Update(); 
};