📄 authsocket.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 + -