Files
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

182 lines
4.2 KiB
Objective-C

/**
* @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;
};
}