499 lines
12 KiB
C
499 lines
12 KiB
C
|
|
#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
|