/** * @file NFIOBuffer.h * @brief I/O Buffering, Packet I/O Buffering * @remarks * @author °­µ¿¸í(edith2580@gmail.com) * @date 2009-04-02 */ #pragma once namespace NaveNet { #define IOBUF_DEF_SIZE DEF_MAXPACKETSIZE*128 // IOBufferÀÇ ±âº»Å©±â ÆÐŶ 1024°³¸¸Å­ 󸮰¡´É /** @class @author °­µ¿¸í(edith2580@gmail.com) @date 2009-03-03 @brief @warning */ /** * @class NFIOBuffer * @brief I/O Buffering Ŭ·¡½º * @remarks I/O Buffering À» À§ÇÑ Å¬·¡½º. SockÀ» ÀÌ¿ëÇØ ÆÐŶÀ» ÁÖ°í ¹ÞÀ»¶§ ÆÐŶÀÌ \r\n * ÇÕÃÄ¿À°Å³ª ºÐÇÒµÇ¾î ¿Ã¶§ ±× ÆÐŶÀ» °ü¸® ¹× ó¸®ÇÒ¶§ »ç¿ëµÈ´Ù.(IOBufferÀ» \r\n * »ó¼Ó¹ÞÀº PacektIOBuffer Ŭ·¡½º·Î ó¸®ÇϰÔ.. \r\n * \r\n * ±âº»ÀûÀ¸·Î PacketBuffer¿¡ ÀúÀåµÇ´Â ½ºÆ®¸µ(?)ÀÇ Çü½ÄÀº ´ÙÀ½°ú °°´Ù. \r\n * --------------------------------------------------------------------------------------- \r\n * | 2byte | 2byte | CheckSum(4Byte) | Header.Siz-Headere ¸¸Å­ÀÇ ½ÇÁ¦ Packet ¿ë·® Header | \r\n * --------------------------------------------------------------------------------------- \r\n * IOBufferŬ·¡½º´Â À§ÀÇ ÆÐŶÀ» ÇϳªÀÇ ¹è¿­¿¡ ¼øÂ÷ÀûÀ¸·Î ³Ö¾î ±× ÆÐŶÀ» \r\n * °ü¸®ÇÑ´Ù. 2Byte´Â 65535±îÁöÀÇ ±æÀ̸¦ ó¸®ÇÑ´Ù. \r\n * @par * @author Edith * @date 2009-04-04 */ class NFIOBuffer { public: /// NFIOBuffer »ý¼ºÀÚ NFIOBuffer(); /// NFIOBuffer ¼Ò¸êÀÚ virtual ~NFIOBuffer(); public: /// »ç¿ëµÈ ¹öÆÛÀÇ Å©±â °è»ê. VOID CalcBuffered(); /** * @brief ¹öÆÛ Æ÷ÀÎÅ͸¦ ¾ò¾î¿É´Ï´Ù. * @return ¹öÆÛ Æ÷ÀÎÅÍ */ inline CHAR* GetBuffer() { return m_cBuf; } /** * @brief Head Pos¸¦ ¼³Á¤ÇÕ´Ï´Ù. * @param Head Head Pos°ª */ inline VOID SetHead(INT Head) { m_iHead = Head; CalcBuffered(); } /** * @brief Head Pos¸¦ °¡Á®¿É´Ï´Ù. * @return Head Pos °ª */ inline INT GetHead() { return m_iHead; } /** * @brief Tail Pos¸¦ ¼³Á¤ÇÕ´Ï´Ù. * @param Tail Tail Pos°ª */ inline VOID SetTail(INT Tail) { m_iTail = Tail; } /** * @brief Tail Pos¸¦ °¡Á®¿É´Ï´Ù. * @return Tail Pos °ª */ inline INT GetTail() { return m_iTail; } /** * @brief ¹öÆÛÀÇ Àüü Å©±â¸¦ ¾ò¾î¿É´Ï´Ù. * @return ¹öÆÛÀÇ Àüü Å©±â */ inline INT GetBufSize() { return m_iBufSize; } /** * @brief »ç¿ëÁßÀÎ ¹öÆÛÀÇ ±æÀ̸¦ ¾ò¾î¿É´Ï´Ù. * @return »ç¿ëÁßÀÎ ¹öÆÛÀÇ ±æÀÌ */ inline INT GetBufferUsed() { return m_iBuffered; } /** * @brief ºñ¾îÀÖ´Â ¹öÆÛÀÇ ±æÀ̸¦ ¾ò¾î¿É´Ï´Ù. * @return ºñ¾îÀÖ´Â ¹öÆÛÀÇ ±æÀÌ */ inline INT GetEmptyBuffer() { return m_iBufSize - m_iBuffered; } /** * @brief ¹öÆÛ¸¦ ÃʱâÈ­ÇÕ´Ï´Ù. */ VOID InitIOBuf(); /** * @brief ¹öÆÛ¸¦ Ãß°¡ÇÕ´Ï´Ù. * @param Buffer ¹öÆÛ * @param Size Å©±â * @return Ãß°¡ÇÑ ±æÀÌ */ INT Append(const CHAR* Buffer, INT Size); /** * @brief ¹öÆÛ¸¦ ÀнÀ´Ï´Ù. * @param Buffer ¹öÆÛ * @param Size ÀÐÀ» Å©±â * @return ÀоîµéÀÎ ±æÀÌ */ INT GetData(CHAR* Buffer, INT Size); /** * @brief ¹öÆÛ±æÀÌ Ã¼Å©ÇÕ´Ï´Ù. * @param Size üũÇÒ ±æÀÌ * @return üũÇÑ ±æÀÌ ¼º°ø½Ã Size°ª°ú µ¿ÀÏ */ INT CheckData(INT Size); /** * @brief ¹öÆÛ¸¦ »ý¼ºÇÕ´Ï´Ù. * @param BufSize »ý¼ºÇÒ ¹öÆÛ Å©±â */ VOID NewIOBuf(INT BufSize); /** * @brief ¹öÆÛ¸¦ »èÁ¦ÇÕ´Ï´Ù. */ VOID DeleteIOBuf(); private: /// ÀÐÀ» ¹öÆÛÀÇ ½ÃÀÛÀ§Ä¡. INT m_iHead; /// »ç¿ëµÈ ¹öÆÛÀÇ ³¡. INT m_iTail; /// »ý¼ºÇÑ ¹öÆÛÀÇ »çÀÌÁî INT m_iBufSize; /// »ý¼ºÇÑ ¹öÆÛÀÇ Æ÷ÀÎÅÍ. CHAR* m_cBuf; /// »ç¿ëµÈ ¹öÆÛÀÇ »çÀÌÁî À̰ªÀÌ À½¼ö¸é Over Flow.. INT m_iBuffered; }; /** * @class NFPacketIOBuffer * @brief Packet I/O Buffering Ŭ·¡½º * @remarks NFPacket¿¡ ÀÚµ¿È­ µÇ¾îÀִ Ŭ·¡½º \r\n * ¼­¹ö¿Í Ŭ¶óÀÌ¾ðÆ®°£ Åë½Å¿¡¼­ »ç¿ëµÈ´Ù. * @par * @author Edith * @date 2009-04-04 */ class NFPacketIOBuffer : public NFIOBuffer { public: /// NFPacketIOBuffer »ý¼ºÀÚ NFPacketIOBuffer(); /// NFPacketIOBuffer ¼Ò¸êÀÚ virtual ~NFPacketIOBuffer(); public: /// ¹öÆÛ¸¦ Lock ÇÕ´Ï´Ù. VOID Lock(); /// ¹öÆÛ¸¦ UnLock ÇÕ´Ï´Ù. VOID UnLock(); // ÇѰ³ºÐ·®ÀÇ ÆÐŶÀ» ¾ò¾î¿Â´Ù. INT GetPacket(NFPacket* Packet); // ÆÐŶüũ BOOL CheckPacket(); private: /// Lock °ú UnLock¿¡¼­ »ç¿ëÇÒ º¯¼ö INT m_iLockHead; }; }