/* ==================================================================== * ÆÄ ÀÏ : ioContextPool.h * ¸ñ Àû : * ÀÛ ¼º ÀÚ : °ûöÁß * ÀÛ ¼º ÀÏ : 04/11/17 * ÁÖÀÇ»çÇ× : * =================================================================== */ #ifndef __IO_CONTEXT_POOL_H__ #define __IO_CONTEXT_POOL_H__ //#ifndef WINVER //#define WINVER 0x0500 //#endif // //#ifndef _WIN32_WINNT //#define _WIN32_WINNT 0x0500 //#endif #ifndef IO_CONTEXT_VER #define IO_CONTEXT_VER 0x0001 #else #if defined(IO_CONTEXT_VER) && (IO_CONTEXT_VER < 0x0001) #error IO_CONTEXT_VER setting conflicts #endif #endif #pragma once #include #include #include "criticalsectionlock.h" #define DEF_TCP_PACKET_SIZE 0x10000 // 65535+1 #define HAL_TCP_PACKET_SIZE 0x08000 // 32767+1 // UDP Packet size 65,535 // IPv4 Header size 60 // UDP Header size 8 #define MAX_UDP_PACKET_SIZE 65467 // 65,535 - 60 - 8 = 65,467 #define DEF_UDP_PACKET_SIZE 65536 // 65,535+1 #ifndef PER_IO_CONTEXT #define PER_IO_CONTEXT enum IOCP_REQUESTTYPE { IOCP_REQUEST_READ = 0, // Àбâ(¼ö½Å) IOCP_REQUEST_WRITE, // ¾²±â(¼Û½Å) IOCP_REQUEST_CALLBACK, // Äݹé }; enum IOCP_REQUESTRESULT { IOCP_REQUEST_SUCCESS = 0, // ¼º°ø IOCP_REQUEST_ERROR, // ¿À·ù }; struct PerIoContext { WSAOVERLAPPED wsaOverlapped; // overlapped I/O ¸ðµ¨ »ç¿ëÀ» À§ÇÑ ±¸Á¶Ã¼ SOCKET socket; // Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏ SOCKADDR_IN addr; // Ŭ¶óÀÌ¾ðÆ® ÁÖ¼Ò char* buffer; // ¼Û/¼ö½Å ¹öÆÛ u_long offset; // ¹öÆÛÀÇ ¿ÀÇÁ¼Â u_long length; // ¹öÆÛÀÇ ±æÀÌ u_long Internal; // ³»ºÎ ¿ÀÇÁ¼Â u_long InternalHigh; // ³»ºÎ ¿ÀÇÁ¼Â u_long requestType; // Request Type u_long requestResult; // Request Result UINT_PTR iParam; // i param ULONG_PTR lParam; // l Param struct PerIoContext* prev; // ¼±Çü¸®½ºÆ®ÀÇ Æ÷ÀÎÅÍ - ÀÌÀü struct PerIoContext* next; // ¼±Çü¸®½ºÆ®ÀÇ Æ÷ÀÎÅÍ - ´ÙÀ½ }; #endif // PER_IO_CONTEXT #define MAX_IO_CONTEXT_BUFFER_LEN 131072 struct IoContextBuffer { PerIoContext* buffer[MAX_IO_CONTEXT_BUFFER_LEN]; long offset; }; class cIoContextPool { protected: CRITICAL_SECTION mCs; // µ¿±âÈ­ Á¦¾î u_long mBufferLength; // ¹öÆÛ Å©±â PerIoContext* mPagedPoolUsage; // ÆäÀÌÁö µÈ Ç® - overlapped I/O ¸ðµ¨ PerIoContext* mNonPagedPoolUsage; // ÆäÀÌÁö ¾ÈµÈ Ç® - overlapped I/O ¸ðµ¨ SIZE_T mQuotaPagedPoolUsage; // ÇöÀç ÆäÀÌÁö µÈ Ç® - »ç¿ë·® SIZE_T mQuotaNonPagedPoolUsage; // ÇöÀç ÆäÀÌÁö ¾ÈµÈ Ç® - »ç¿ë·® SIZE_T mWorkingSetSize; // ÇöÀç ÀÛ¾÷ ¼³Á¤Å©±â. protected: PerIoContext* AllocIoContext ( ); void FreeIoContext ( PerIoContext** perIoContext ); protected: void AttachPool ( PerIoContext** pool, PerIoContext* perIoContext ); void DetachPool ( PerIoContext** pool, PerIoContext* perIoContext ); PerIoContext* GetPool ( ); void ReleasePool ( PerIoContext* perIoContext, bool deleteIoContext=false ); public: cIoContextPool(u_long bufferLength=DEF_TCP_PACKET_SIZE); bool DefaultWorkingSize ( DWORD workingSize ); void GetProcessMemoryInfo ( SIZE_T& quotaPagedPoolUsage, SIZE_T& quotaNonPagedPoolUsage, SIZE_T& workingSetSize ); void Shutdown ( ); u_long GetBufferLength ( ) { return mBufferLength; } PerIoContext* GetPagedPoolUsage ( ) { return mPagedPoolUsage; } PerIoContext* GetIoContext ( ); PerIoContext* GetIoContext ( SOCKET socket, u_long request ); PerIoContext* GetIoContext ( SOCKET socket, u_long request, SOCKADDR_IN addr ); void ReleaseIoContext ( PerIoContext* perIoContext, bool deleteIoContext=false, DWORD* errorPtr=NULL ); public: virtual ~cIoContextPool(void); }; #endif // __IO_CONTEXT_POOL_H__