/******************************************************************** created: 2005/03/10 created: 10:3:2005 15:33 filename: E:\Project\무인?ë‹´?œìФ??IOCPNetwork\HMIOCPDefinition.h file path: E:\Project\무인?ë‹´?œìФ??IOCPNetwork file base: HMIOCPDefinition file ext: h author: Chae Hi-myung purpose: Á¤Àǵé... *********************************************************************/ #include //typedef unsigned long ULONG_PTR; //#define MAX_BUFFER_SIZE 8192 * 10 #define MAX_BUFFER_SIZE 8192 * 1000 #define SIZE_IOCONTEXT (sizeof(WSAOVERLAPPED) + sizeof(WSABUF) + (MAX_BUFFER_SIZE + 1) + sizeof(BOOL)) #define SIZE_SOCKETCONTEXT 16 enum NetworkMode { ServerMode, ClientMode}; // OVERLAPPED ±¸Á¶Ã¼¸¦ È®Àå typedef struct _PERIOCONTEXT // BulkBuffer¸¦ ©¶ó¼­ reint...Cast Çϱ⠶§¹®¿¡ »ý¼ºÀÚ, ¼Ò¸êÀÚ°¡ È£ÃâµÇÁö ¾Ê´Â´Ù. { protected: WSAOVERLAPPED overlapped; WSABUF wsaBuf; char Buffer[MAX_BUFFER_SIZE + 1]; BOOL bIsUse; public: BOOL IsLocked() { return bIsUse; } void LockBuffer() { bIsUse = TRUE; } void UnlockBuffer() { bIsUse = FALSE; } int GetLen() { return wsaBuf.len; } WSAOVERLAPPED* GetOverlapped() { return &overlapped; } void ResetOverlapped() { ZeroMemory(&overlapped, sizeof(WSAOVERLAPPED)); } void ResetBuffer() { wsaBuf.buf = Buffer; } int StringCompare(char* str) { return strcmp(wsaBuf.buf, str); } WSABUF* GetLockedBuffer() { return &wsaBuf; } char* GetBulkBuffer() { return Buffer; } WSABUF* GetBuffer() { int nCount = 0; while (bIsUse) return NULL; LockBuffer(); return &wsaBuf; } void ReleaseBuffer() { ZeroMemory(&overlapped, sizeof(WSAOVERLAPPED)); ZeroMemory(Buffer, MAX_BUFFER_SIZE + 1); wsaBuf.buf = Buffer; wsaBuf.len = MAX_BUFFER_SIZE; UnlockBuffer(); } // º¹»ç »ý¼ºÀÚ. _PERIOCONTEXT(const _PERIOCONTEXT& rhs) { if(this != &rhs) { ZeroMemory(&overlapped, sizeof(WSAOVERLAPPED)); ZeroMemory(Buffer, MAX_BUFFER_SIZE + 1); memcpy(Buffer, rhs.Buffer, MAX_BUFFER_SIZE); wsaBuf.buf = Buffer; wsaBuf.len = rhs.wsaBuf.len; bIsUse = FALSE; } } // ´ëÀÔ¿¬»êÀÚ ¿À¹ö·Îµù. _PERIOCONTEXT& operator=(const _PERIOCONTEXT& rhs) { if(this != &rhs) { ZeroMemory(&overlapped, sizeof(WSAOVERLAPPED)); ZeroMemory(Buffer, MAX_BUFFER_SIZE + 1); memcpy(Buffer, rhs.Buffer, MAX_BUFFER_SIZE); wsaBuf.buf = Buffer; wsaBuf.len = rhs.wsaBuf.len; bIsUse = FALSE; } return *this; } } PerIoContext, *pPerIoContext; // IP Completion Key ·Î »ç¿ëµÇ´Â ±¸Á¶Ã¼ typedef struct _PERSOCKETCONTEXT { SOCKET socket; pPerIoContext recvContext; pPerIoContext sendContext; _PERSOCKETCONTEXT() { Reset(); } void Reset() { recvContext->ReleaseBuffer(); sendContext->ReleaseBuffer(); socket = INVALID_SOCKET; } } PerSocketContext, *pPerSocketContext;