Files
wnmj/Servers/服务器组件/内核引擎/TCPNetworkEngine.h

499 lines
12 KiB
C
Raw Normal View History

2026-02-13 14:34:15 +08:00
#ifndef SOCKET_ENGINE_HEAD_FILE
#define SOCKET_ENGINE_HEAD_FILE
//<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
#include "KernelEngineHead.h"
#include "QueueService.h"
#include "QueueServiceEvent.h"
//<2F>ر<EFBFBD>ԭ<EFBFBD><D4AD>
#define SHUT_REASON_INSIDE 0 //<2F>ڲ<EFBFBD>ԭ<EFBFBD><D4AD>
#define SHUT_REASON_NORMAL 1 //<2F><><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
#define SHUT_REASON_REMOTE 2 //Զ<>̹ر<CCB9>
#define SHUT_REASON_TIME_OUT 3 //<2F><><EFBFBD>糬ʱ
#define SHUT_REASON_EXCEPTION 4 //<2F><EFBFBD>ر<EFBFBD>
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>״̬
#define SOCKET_STATUS_IDLE 0 //<2F><><EFBFBD><EFBFBD>״̬
#define SOCKET_STATUS_WAIT 1 //<2F>ȴ<EFBFBD>״̬
#define SOCKET_STATUS_CONNECT 2 //<2F><><EFBFBD><EFBFBD>״̬
//<2F><><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
#define CONNECT_SUCCESS 0 //<2F><><EFBFBD>ӳɹ<D3B3>
#define CONNECT_FAILURE 1 //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
#define CONNECT_EXCEPTION 2 //<2F><><EFBFBD><EFBFBD><EFBFBD>
#define CONNECT_PROXY_FAILURE 3 //<2F><><EFBFBD>ӳɹ<D3B3>
#define CONNECT_PROXY_USER_INVALID 4 //<2F>û<EFBFBD><C3BB><EFBFBD>Ч
//////////////////////////////////////////////////////////////////////////
//ö<>ٶ<EFBFBD><D9B6><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enum enOperationType
{
OperationType_Send, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OperationType_Recv, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
//////////////////////////////////////////////////////////////////////////
//<2F><>˵<EFBFBD><CBB5>
class COverLapped;
class CServerSocketRSThread;
class COverLappedSend;
class CTCPNetworkEngine;
class CServerSocketItem;
class CSocketAcceptThread;
template <enOperationType OperationType> class CATLOverLapped;
typedef class CATLOverLapped<OperationType_Recv> COverLappedRecv;
typedef CWHArray<COverLappedSend *> COverLappedSendPtr;
typedef CWHArray<COverLappedRecv *> COverLappedRecvPtr;
//////////////////////////////////////////////////////////////////////////
//<2F>ӿڶ<D3BF><DAB6><EFBFBD>
//<2F><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ص<EFBFBD><D8B5>ӿ<EFBFBD>
interface IServerSocketItemSink
{
//Ӧ<><D3A6><EFBFBD><EFBFBD>Ϣ
virtual bool OnSocketAcceptEvent(CServerSocketItem * pServerSocketItem) = NULL;
//<2F><>ȡ<EFBFBD><C8A1>Ϣ
virtual bool OnSocketReadEvent(TCP_Command Command, void * pBuffer, WORD wDataSize, CServerSocketItem * pServerSocketItem) = NULL;
//<2F>ر<EFBFBD><D8B1><EFBFBD>Ϣ
virtual bool OnSocketCloseEvent(CServerSocketItem * pServerSocketItem) = NULL;
};
//////////////////////////////////////////////////////////////////////////
//<2F>ص<EFBFBD><D8B5><EFBFBD><E1B9B9>
class COverLapped
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
WSABUF m_WSABuffer; //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
OVERLAPPED m_OverLapped; //<2F>ص<EFBFBD><D8B5>
const enOperationType m_OperationType; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
COverLapped(enOperationType OperationType);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~COverLapped();
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
public:
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
enOperationType GetOperationType()
{
return m_OperationType;
}
};
//<2F><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5>
class COverLappedSend : public COverLapped
{
//<2F><><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
public:
BYTE m_cbBuffer[SOCKET_TCP_BUFFER]; //<2F><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
COverLappedSend();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~COverLappedSend();
};
//<2F>ص<EFBFBD><D8B5>ṹģ<E1B9B9><C4A3>
template <enOperationType OperationType> class CATLOverLapped : public COverLapped
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CATLOverLapped() : COverLapped(OperationType) {}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~CATLOverLapped() {}
};
//////////////////////////////////////////////////////////////////////////
//TCP SOCKET <20><>
class CServerSocketItem
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
DWORD m_dwClientAddr; //<2F><><EFBFBD>ӵ<EFBFBD>ַ
DWORD m_dwConnectTime; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//<2F><><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
protected:
WORD m_wRountID; //ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SOCKET m_hSocket; //SOCKET <20><><EFBFBD><EFBFBD>
//״̬<D7B4><CCAC><EFBFBD><EFBFBD>
protected:
bool m_bNotify; //֪ͨ<CDA8><D6AA>־
bool m_bRecvIng; //<2F><><EFBFBD>ձ<EFBFBD>־
bool m_bCloseIng; //<2F>رձ<D8B1>־
bool m_bAllowBatch; //<2F><><EFBFBD><EFBFBD>Ⱥ<EFBFBD><C8BA>
DWORD m_wRecvSize; //<2F><><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>
BYTE m_cbRecvBuf[SOCKET_TCP_BUFFER*5]; //<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
DWORD m_dwSendTickCount; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
DWORD m_dwRecvTickCount; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
DWORD m_dwSendPacketCount; //<2F><><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>
DWORD m_dwRecvPacketCount; //<2F><><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
BYTE m_cbSendRound; //<2F>ֽ<EFBFBD>ӳ<EFBFBD><D3B3>
BYTE m_cbRecvRound; //<2F>ֽ<EFBFBD>ӳ<EFBFBD><D3B3>
DWORD m_dwSendXorKey; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ
DWORD m_dwRecvXorKey; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Կ
//<2F>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
protected:
const WORD m_wIndex; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CCriticalSection m_CriticalSection; //ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
COverLappedRecv m_OverLappedRecv; //<2F>ص<EFBFBD><D8B5>
COverLappedSendPtr m_OverLappedSendFree; //<2F>ص<EFBFBD><D8B5>
COverLappedSendPtr m_OverLappedSendActive; //<2F>ص<EFBFBD><D8B5>
IServerSocketItemSink * m_pIServerSocketItemSink; //<2F>ص<EFBFBD><D8B5>ӿ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CServerSocketItem(WORD wIndex, IServerSocketItemSink * pIServerSocketItemSink);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~CServerSocketItem(void);
//<2F><>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>
public:
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WORD GetIndex()
{
return m_wIndex;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
WORD GetRountID()
{
return m_wRountID;
}
//<2F><>ȡ<EFBFBD><C8A1>ʶ
DWORD GetSocketID()
{
return MAKELONG(m_wIndex, m_wRountID);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><>ȡ<EFBFBD><C8A1>ַ
DWORD GetClientAddr()
{
return m_dwClientAddr;
}
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
DWORD GetConnectTime()
{
return m_dwConnectTime;
}
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
DWORD GetSendTickCount()
{
return m_dwSendTickCount;
}
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
DWORD GetRecvTickCount()
{
return m_dwRecvTickCount;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CCriticalSection& GetSignedLock()
{
return m_CriticalSection;
}
//<2F><>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
bool IsReadySend()
{
return m_dwRecvPacketCount > 0L;
}
//<2F>Ƿ<EFBFBD>Ⱥ<EFBFBD><C8BA>
bool IsAllowBatch()
{
return m_bAllowBatch;
}
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
bool IsValidSocket()
{
return (m_hSocket != INVALID_SOCKET);
}
//<2F><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD>
public:
//<2F>󶨶<EFBFBD><F3B6A8B6><EFBFBD>
DWORD Attach(SOCKET hSocket, DWORD dwClientAddr);
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
bool SendData(WORD wMainCmdID, WORD wSubCmdID, WORD wRountID);
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
bool SendData(void * pData, WORD wDataSize, WORD wMainCmdID, WORD wSubCmdID, WORD wRountID);
//<2F><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>
bool RecvData();
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bool CloseSocket(WORD wRountID);
//<2F><><EFBFBD>ùر<C3B9>
bool ShutDownSocket(WORD wRountID);
//<2F><><EFBFBD><EFBFBD>Ⱥ<EFBFBD><C8BA>
bool AllowBatchSend(WORD wRountID, bool bAllowBatch);
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
void ResetSocketData();
//֪ͨ<CDA8>ӿ<EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ
bool OnSendCompleted(COverLappedSend * pOverLappedSend, DWORD dwThancferred);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ
bool OnRecvCompleted(COverLappedRecv * pOverLappedRecv, DWORD dwThancferred);
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>֪ͨ
bool OnCloseCompleted();
//<2F>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
private:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD EncryptBuffer(BYTE pcbDataBuffer[], WORD wDataSize, WORD wBufferSize);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD CrevasseBuffer(BYTE pcbDataBuffer[], WORD wDataSize);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private:
//<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>
inline WORD SeedRandMap(WORD wSeed);
//ӳ<><EFBFBD><E4B7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline BYTE MapSendByte(BYTE const cbData);
//ӳ<><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
inline BYTE MapRecvByte(BYTE const cbData);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ͽṹ
inline COverLappedSend * GetSendOverLapped();
};
//////////////////////////////////////////////////////////////////////////
//<2F><>д<EFBFBD>߳<EFBFBD><DFB3><EFBFBD>
class CServerSocketRSThread : public CWHThread
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
HANDLE m_hCompletionPort; //<2F><><EFBFBD>ɶ˿<C9B6>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CServerSocketRSThread(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~CServerSocketRSThread(void);
//<2F><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD>
public:
//<2F><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
bool InitThread(HANDLE hCompletionPort);
//<2F><><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>
private:
//<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD>
virtual bool OnEventThreadRun();
};
//////////////////////////////////////////////////////////////////////////
//Ӧ<><D3A6><EFBFBD>̶߳<DFB3><CCB6><EFBFBD>
class CSocketAcceptThread : public CWHThread
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
SOCKET m_hListenSocket; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HANDLE m_hCompletionPort; //<2F><><EFBFBD>ɶ˿<C9B6>
CTCPNetworkEngine * m_pTCPSocketManager; //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CSocketAcceptThread(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~CSocketAcceptThread(void);
//<2F><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD>
public:
//<2F><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
bool InitThread(HANDLE hCompletionPort, SOCKET hListenSocket, CTCPNetworkEngine * pTCPSocketManager);
//<2F><><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>
private:
//<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD>
virtual bool OnEventThreadRun();
};
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>
class CSocketDetectThread : public CWHThread
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
DWORD m_dwTickCount; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
CTCPNetworkEngine * m_pTCPSocketManager; //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CSocketDetectThread(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~CSocketDetectThread(void);
//<2F><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD>
public:
//<2F><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
bool InitThread(CTCPNetworkEngine * pTCPSocketManager);
//<2F><><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>
private:
//<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD>
virtual bool OnEventThreadRun();
};
//////////////////////////////////////////////////////////////////////////
//<2F><>˵<EFBFBD><CBB5>
typedef CWHArray<CServerSocketItem *> CServerSocketItemPtrArray;
typedef CWHArray<CServerSocketRSThread *> CServerSocketRSThreadPtrArray;
//////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class CTCPNetworkEngine : public ITCPNetworkEngine, public IServerSocketItemSink, public IQueueServiceSink
{
friend class CServerSocketRSThread;
friend class CSocketAcceptThread;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
CCriticalSection m_CriticalSection;
CServerSocketItemPtrArray m_FreeSocketItem; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CServerSocketItemPtrArray m_ActiveSocketItem; //<2F><EFBFBD><EEB6AF><EFBFBD><EFBFBD>
CServerSocketItemPtrArray m_StorageSocketItem; //<2F><EFBFBD><E6B4A2><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
DWORD m_dwLastDetect; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
CServerSocketItemPtrArray m_TempSocketItem; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
protected:
WORD m_wListenPort; //<2F><><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
WORD m_wMaxSocketItem; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
CQueueService m_SendQueueService; //<2F><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
CQueueServiceEvent m_QueueServiceEvent; //֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD>
//<2F>ں˱<DABA><CBB1><EFBFBD>
protected:
bool m_bService; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
SOCKET m_hServerSocket; //<2F><><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD>
HANDLE m_hCompletionPort; //<2F><><EFBFBD>ɶ˿<C9B6>
CSocketDetectThread m_SocketDetectThread; //<2F><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
CSocketAcceptThread m_SocketAcceptThread; //Ӧ<><D3A6><EFBFBD>߳<EFBFBD>
CServerSocketRSThreadPtrArray m_SocketRSThreadArray; //<2F><>д<EFBFBD>߳<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CTCPNetworkEngine(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual ~CTCPNetworkEngine(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
public:
//<2F>ͷŶ<CDB7><C5B6><EFBFBD>
virtual VOID Release()
{
if (IsValid()) delete this;
}
//<2F>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
virtual bool IsValid()
{
return AfxIsValidAddress(this, sizeof(CTCPNetworkEngine)) ? true : false;
}
//<2F>ӿڲ<D3BF>ѯ
virtual void * QueryInterface(const IID & Guid, DWORD dwQueryVer);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual bool StartService();
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
virtual bool ConcludeService();
//<2F><>Ϣ<EFBFBD>ӿ<EFBFBD>
public:
//<2F><><EFBFBD>ö˿<C3B6>
virtual WORD GetServicePort();
//<2F><>ǰ<EFBFBD>˿<EFBFBD>
virtual WORD GetCurrentPort();
//<2F><><EFBFBD>ýӿ<C3BD>
public:
//<2F><><EFBFBD>ýӿ<C3BD>
virtual bool SetTCPNetworkEngineEvent(IUnknownEx * pIUnknownEx);
//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
virtual bool SetServiceParameter(WORD wServicePort, WORD wMaxConnect, LPCTSTR pszCompilation);
//<2F><><EFBFBD>нӿ<D0BD>
public:
//֪ͨ<CDA8>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
virtual void OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual bool DetectSocket();
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
virtual bool SendData(DWORD dwSocketID, WORD wMainCmdID, WORD wSubCmdID);
//<2F><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
virtual bool SendData(DWORD dwSocketID, WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual bool SendDataBatch(WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize, BYTE cbBatchMask);
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
virtual bool CloseSocket(DWORD dwSocketID);
//<2F><><EFBFBD>ùر<C3B9>
virtual bool ShutDownSocket(DWORD dwSocketID);
//<2F><><EFBFBD><EFBFBD>Ⱥ<EFBFBD><C8BA>
virtual bool AllowBatchSend(DWORD dwSocketID, bool bAllow, BYTE cbBatchMask);
//֪ͨ<CDA8>ӿ<EFBFBD>
public:
//Ӧ<><D3A6><EFBFBD><EFBFBD>Ϣ
virtual bool OnSocketAcceptEvent(CServerSocketItem * pServerSocketItem);
//<2F><>ȡ<EFBFBD><C8A1>Ϣ
virtual bool OnSocketReadEvent(TCP_Command Command, void * pBuffer, WORD wDataSize, CServerSocketItem * pServerSocketItem);
//<2F>ر<EFBFBD><D8B1><EFBFBD>Ϣ
virtual bool OnSocketCloseEvent(CServerSocketItem * pServerSocketItem);
//<2F>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
protected:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
CServerSocketItem * ActiveSocketItem();
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
CServerSocketItem * EnumSocketItem(WORD wIndex);
//<2F>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD>
bool FreeSocketItem(CServerSocketItem * pServerSocketItem);
};
#endif