⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 authsocket.h

📁 五行MMORPG引擎系统V1.0
💻 H
字号:
/*/////////////////////////////////////////////////////////////////////////////

	李亦
	2006.06.
/*//////////////////////////////////////////////////////////////////////////////


#ifndef _AUTHSOCKET_H_
#define _AUTHSOCKET_H_

#ifndef _TVECTOR_H_
#include "core/tVector.h"
#endif


#ifndef __INC_IOSOCKET_H
#include "server/net/IOSocket.h"
#endif

#ifndef __INC_ENCRYPTION_H
#include "server/encrypt/EncryptEngine.h"
#endif

#ifndef _BITSTREAM_H_
#include "core/bitStream.h"
#endif

#ifndef _EVENT_H_
#include "platform/event.h"
#endif

#ifndef _PLATFORMMUTEX_H_
#include "platform/platformMutex.h"
#endif

#ifndef _NETGATEWAY_H_
#include "server/net/netGateway.h"
#endif

#ifndef _AUTHHANDLERMANAGER_H_
#include "server/net/authHandlerManager.h"
#endif


class NetConnection;


namespace CS
{

#define INVALID_AUTHPTR				((CAuthSocket *)NULL)//0xFFFFFFFF)




#define DECL_WORKSTATE(Name)\
	BOOL	Is##Name()	{\
		m_mutexWorkState.lock(true);\
		BOOL bRet = (m_dwWorkState&WS_##Name) == WS_##Name;\
		m_mutexWorkState.unlock();\
		return bRet;\
	}\
	void  Set##Name(BOOL bSet=TRUE)\
	{\
		m_mutexWorkState.lock(true);\
		if(bSet) m_dwWorkState |= WS_##Name;\
		else m_dwWorkState &= ~WS_##Name;\
		m_mutexWorkState.unlock();\
	}


///////////////////////////////////////////////////////////////////////////////
// Socket class
class CAuthSocket 
{
	friend class CAuthSocket;
	friend class NetConnection;

	enum SocketState
	{
		ASS_NULL,
		ASS_SINGLE,
		ASS_QUEUE,
	};

	void					*m_pData;
	NetGateway			m_netGateway;

	PacketBuffer*		m_pPacketBufSend;
	SocketState			m_ssQueueSend;

	PacketBuffer*		m_pPacketBufRecv;
	SocketState			m_ssQueueRecv;

	
	PacketQueueCycle	m_queueRecv;
	PacketQueueCycle	m_queueSend;
	NetConnection*		m_pConnection;
	
	U32					m_dwWorkState;

	MutexInstance		m_mutexWorkState;
public:
	enum
	{
		WS_ACCEPTING	= 0x0001,
		WS_SENDING		= 0x0002,
		WS_RECVING		= 0x0004,
		WS_TOBEDIE		= 0x0008,
		WS_ESTABLISHED	= 0x0010,
		WS_KILLING		= 0x0020,
	};


	CS_AUTHHANDLER		*m_pAuthHandler;
	CS_IOHANDLER		*m_pIOHandler;
	CS_ENCRYPTHANDLER	*m_pEncryptHandler;

	CIOSocket			*m_pIOSock;
	CEncryptionEngine *m_pEncryptEngine;
	
public:
	DECL_WORKSTATE(ACCEPTING)
	DECL_WORKSTATE(SENDING)
	DECL_WORKSTATE(RECVING)
	DECL_WORKSTATE(TOBEDIE)
	DECL_WORKSTATE(ESTABLISHED)
	DECL_WORKSTATE(KILLING)

	//BitStream	*GetSendStream(){return &m_streamSend;}
	//BitStream	*GetRecvStream(){return &m_streamRecv;}

	BOOL	IsAlive()	{return !IsTOBEDIE();}

	/*////////////////////////////////////////////////////
	BeginSend()					申请数据缓冲区
		stream->opr				填充数据包
	EndSend()					将数据加到发送队列中
	SendOutPacket()			发送线程将从队列中取出数据
	/*////////////////////////////////////////////////////

	BOOL	BeginSend(BitStream* pStream,BOOL bQueue=TRUE,U8 uPacketType=PT_GAMENORMAL);
	BOOL	EndSend(BitStream* pStream, BOOL bProcessNow=FALSE);
	//因为SendOutPacket可能由其它线程调用,无法使用成员变量判断,须由调用者来决定是否为队列模式
	S32	SendOutPacket(BOOL bQueue=TRUE);	

	/*////////////////////////////////////////////////////
	BeginRecv()					申请数据缓冲区
	EndSend()					Recv数据,并将数据加到发送队列中
	DispatchRecvStream		解析数据包
	/*////////////////////////////////////////////////////

	BOOL		BeginRecv(BOOL bQueue=TRUE,U8 uPacketType=PT_GAMENORMAL);
	BOOL		EndRecv();
	private:
	//因为SendOutPacket可能由其它线程调用,无法使用成员变量判断,须由调用者来决定是否为队列模式
	BOOL		DispatchRecvStream(BitStream* pStream, BOOL bQueue=TRUE);

public:

	void AttachConnection(NetConnection* pConn)	{m_pConnection = pConn;}
	NetConnection* GetConnection( )					{return m_pConnection;}

	BOOL BlockRecvPacket(U8 uPacketType);
	//连接参数初步处理
public:
	virtual BOOL ProcessRecvPackets(BitStream* pStream, U8 uPacketType);
	


public:
	virtual BOOL CheckAccept(BOOL bCheckState);
	virtual BOOL CheckRecv(BOOL bCheckState);
	virtual BOOL CheckSend(BOOL bCheckState);

public:
	virtual CAuthSocket *Accept(void);
	virtual int				Connect	(char *svTarget, int nUserId);
	virtual BOOL			OnAcceptParam(CAuthSocket	*pAuthSockNew);
	virtual BOOL			OnConnectParam(void);

	virtual int		Listen	(char *svTarget, int nUserId);
	virtual int		GetUserID(void);
	virtual int		Close		(void);
	virtual int		Recv		(BYTE *pInData, int *pnInDataLen);
	virtual int		Send		(BYTE *pData, int nDataLen);
	virtual int		RecvEx	(BYTE **pInData, int *pnInDataLen);
	virtual int		SendEx	(BYTE *pData, int nDataLen);
	virtual void	Free		(BYTE *pBuffer);
	virtual int		GetRemoteAddr	(char *svAddr,int nMaxLen);
	virtual int		GetConnectAddr	(char *svAddr,int nMaxLen);
	virtual void*	GetNetAddress ();

	virtual CS_AUTHHANDLER *GetAuthHandler(void);

public:
	CAuthSocket(CS_AUTHHANDLER *pHandler, CS_IOHANDLER *pIOH, CS_ENCRYPTHANDLER *pEE);
	virtual ~CAuthSocket();
};


inline BOOL CAuthSocket::CheckAccept(BOOL bCheckState)
{
	if(bCheckState && IsACCEPTING())
		return FALSE;
	return m_pIOSock->CheckAccept();
}

inline BOOL CAuthSocket::CheckRecv(BOOL bCheckState)
{
	if(/*!IsESTABLISHED() ||*/ bCheckState && IsRECVING())
		return FALSE;
	return m_pIOSock->CheckRecv();
}

inline BOOL CAuthSocket::CheckSend(BOOL bCheckState)
{
	if(/*!IsESTABLISHED() ||*/ bCheckState && IsSENDING())
		return FALSE;
	return m_pIOSock->CheckSend();
}


typedef int (INTERACT_CONN_PROC)(HWINDOW hParent,LPCSTR svBindStr,LPCSTR svNetMod,LPCSTR svEncryption,LPCSTR svAuth,char *svRBindStr,char *svRNetMod,char *svREncryption,char *svRAuth);
typedef int (INTERACT_LISTEN_PROC)(HWINDOW hParent,LPCSTR svBindStr,LPCSTR svNetMod,LPCSTR svEncryption,LPCSTR svAuth,char *svRBindStr,char *svRNetMod,char *svREncryption,char *svRAuth);


};//namespace CS


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -