/* ==================================================================== *< * ÆÄ ÀÏ : socketContext.h * ¸ñ Àû : * ÀÛ ¼º ÀÚ : °ûöÁß * ÀÛ ¼º ÀÏ : 04/12/02 * ÁÖÀÇ»çÇ× : Header: Declared in winsock2.h Library: Use ws2_32.lib **********************************************************************/ #ifndef __SOCKET_CONTEXT_POOL_H__ #define __SOCKET_CONTEXT_POOL_H__ //#ifndef WINVER //#define WINVER 0x0500 //#endif // //#ifndef _WIN32_WINNT //#define _WIN32_WINNT 0x0500 //#endif #ifndef SOCKET_CONTEXT_VER #define SOCKET_CONTEXT_VER 0x0001 #else #if defined(SOCKET_CONTEXT_VER) && (SOCKET_CONTEXT_VER < 0x0001) #error SOCKET_CONTEXT_VER setting conflicts #endif #endif #pragma once #include #include #include "criticalsectionlock.h" //#include "AntiCpXSvr.h" #ifndef __MIN_MAX_TTL__ #define __MIN_MAX_TTL__ #define MAX_TTL 0x2BF20 // 180000 = (60*1000)*3 = 3ºÐ(¿¬Àå) #define MIN_TTL 0XEA60 // 60000 = (60*1000) = 1ºÐ(¿¬Àå) #endif // __MIN_MAX_TTL__ #ifndef PER_SOCKET_CONTEXT #define PER_SOCKET_CONTEXT struct PerSocketContext { SOCKET socket; // Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏ u_long seq; // Sequence Number u_long ack; // Acknowledgment Number union { struct { u_char connectionID : 1; // CID »ç¿ë ( 0 Off / 1 On ) u_char connectionDead : 1; // ¿¬°áÀÌ ²÷¾îÁü ( 0 Off / 1 On ) u_char closeSocket : 1; // ¼ÒÄÏÀ» ´Ý´Â´Ù ( 0 Off / 1 On ) u_char closeWait : 1; // ´Ý±â ´ë±âÁß ( 0 Off / 1 On ) } status; BYTE statusMask; BYTE statusData; }; SOCKADDR_IN addr; // ÀÎÅÍ³Ý ÁÖ¼Ò DWORD timeToLive; // Time To Live (TTL) char* buffer; // ¹öÆÛ u_long offset; // ¹öÆÛÀÇ ¿ÀÇÁ¼Â u_long length; // ¹öÆÛÀÇ ±æÀÌ u_long Internal; // ³»ºÎ ¿ÀÇÁ¼Â u_long InternalHigh; // ³»ºÎ ¿ÀÇÁ¼Â DWORD cid; // Connection ID char* wsaBuf; // ¹öÆÛ u_long wsaOff; // ¹öÆÛÀÇ ¿ÀÇÁ¼Â u_long wsaLen; // ¹öÆÛÀÇ ±æÀÌ struct PerSocketContext* next; // Dual Linked List ÂüÁ¶ Æ÷ÀÎÅÍ struct PerSocketContext* prev; // Dual Linked List ÂüÁ¶ Æ÷ÀÎÅÍ struct PerSocketContext* parent; // BST - ¸ðü struct PerSocketContext* left; // BST - ¿ÞÂÊ (Left = Less than) struct PerSocketContext* right; // BST - ¿À¸¥ÂÊ (Right = Greater than) }; #endif // PER_SOCKET_CONTEXT class cSocketContextPool { protected: CRITICAL_SECTION* mCs; // µ¿±âÈ­ Á¦¾î u_long mBufferLength; // ¹öÆÛ Å©±â protected: PerSocketContext* mPagedPoolUsage; // ÆäÀÌÁö µÈ Ç® PerSocketContext* mNonPagedPoolUsage; // ÆäÀÌÁö ¾ÈµÈ Ç® PerSocketContext* mBstRoot; // BST - ·çÆ®. protected: SIZE_T mQuotaPagedPoolUsage; // ÇöÀç ÆäÀÌÁö µÈ Ç® - »ç¿ë·® SIZE_T mQuotaNonPagedPoolUsage; // ÇöÀç ÆäÀÌÁö ¾ÈµÈ Ç® - »ç¿ë·® SIZE_T mWorkingSetSize; // ÇöÀç ÀÛ¾÷ ¼³Á¤Å©±â. protected: PerSocketContext* AllocSocketContext ( ); void FreeSocketContext ( PerSocketContext** perSocketContext ); int CompareCID ( PerSocketContext* perSocketContext1, PerSocketContext* perSocketContext2 ); int CompareCID ( int cid1, int cid2 ); protected: void AttachPool ( PerSocketContext** pool, PerSocketContext* perSocketContext ); void DetachPool ( PerSocketContext** pool, PerSocketContext* perSocketContext ); bool AttachBst ( PerSocketContext* perSocketContext ); bool DetachBst ( PerSocketContext* perSocketContext ); PerSocketContext* GetPool ( ); void ReleasePool ( PerSocketContext* perSocketContext, bool isDelete=false ); public: cSocketContextPool(CRITICAL_SECTION* cs, u_long bufferLength=0x10000); bool DefaultWorkingSize ( DWORD workingSize ); void GetProcessMemoryInfo ( SIZE_T& quotaPagedPoolUsage, SIZE_T& quotaNonPagedPoolUsage, SIZE_T& workingSetSize ); void Shutdown ( ); PerSocketContext* GetPagedPoolUsage ( ) { return mPagedPoolUsage; } bool ClearCID ( PerSocketContext* perSocketContext ); PerSocketContext* GetCID ( DWORD cid ); bool SetCID ( PerSocketContext* perSocketContext, DWORD cid ); PerSocketContext* GetPerSocketContext ( SOCKET socket, SOCKADDR_IN addr, DWORD ttl=MAX_TTL ); void ReleasePerSocketContext ( PerSocketContext* perSocketContext, bool isDelete=false ); public: virtual ~cSocketContextPool(void); }; #endif // __SOCKET_CONTEXT_POOL_H__